Android应用程序上的Opencv canny边缘检测崩溃

我是新手使用OpenCV,当我尝试应用Canny探测器时,我的应用程序崩溃了。 我看过另一篇关于同样的post,但是我试了一下,没什么……

我使用Android Studio 3.0,OpenCV 3.2.0,我的手机是Android 6.0.1。

这是我的代码。 我尝试了很多组合,当我尝试应用Canny探测器时总是失败。 请注意最后一个方法onCameraFrame …它适用于Rgba和Gray图像,但不适用于Canny:

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{ private static String TAG = "MainActivity"; JavaCameraView javaCameraView; Mat mRgba, imgGray, imgCanny, wide; BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status){ switch(status){ case BaseLoaderCallback.SUCCESS:{ javaCameraView.enableView(); break; } default:{ super.onManagerConnected(status); break; } } } }; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); javaCameraView = (JavaCameraView) findViewById(R.id.java_camera_view); javaCameraView.setVisibility(SurfaceView.VISIBLE); javaCameraView.setCvCameraViewListener(this); } @Override protected void onPause(){ super.onPause(); if(javaCameraView!=null) javaCameraView.disableView(); } @Override protected void onDestroy(){ super.onDestroy(); if(javaCameraView!=null) javaCameraView.disableView(); } @Override protected void onResume(){ super.onResume(); if(OpenCVLoader.initDebug()){ Log.i(TAG, "Opencv loaded succesfully"); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } else { Log.i(TAG, "Opencv not loaded"); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mLoaderCallback); } } @Override public void onCameraViewStarted(int width, int height) { mRgba = new Mat (height, width, CvType.CV_8UC4); imgGray = new Mat (height, width, CvType.CV_8UC1); imgCanny = new Mat (height, width, CvType.CV_8UC1); } @Override public void onCameraViewStopped() { mRgba.release(); } @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { imgGray = inputFrame.gray(); //mRgba = inputFrame.rgba(); //Imgproc.cvtColor(mRgba, imgGray, Imgproc.COLOR_RGB2GRAY); Imgproc.Canny(imgGray, imgCanny, 50, 150); //detector canny return imgCanny; } } 

我也想知道是否可以捕捉图像并将其保存到图库中。 也许使用onTouch方法? 非常感谢你!

只有OpenCV v3.1适用于Canny Edge检测。 有更高版本的问题(v3.4)。 希望这可以帮助!

我相信当应用程序碰到Canny检测器时会崩溃,因为您的设备上安装了错误的OpenCV Manager类型,无论是版本号还是中央处理器指令集。 检查正确的版本应该很简单。 只需转到OpenCV-android-sdk \ apk目录并检查OpenCV_之后的3(xyz)数字

设备执行Imgproc.Canny函数调用时应该崩溃。

检查适用于Windows的Android设备的指令集

要检查设备的指令集,请导航到通常位于以下位置的adb(android调试桥)目录:

C:\ Users \ <'您的用户名'> \ AppData \ Local \ Android \ Sdk \ platform-tools运行命令:

 ./adb.exe shell cat /proc/cpuinfo 

获取正确的指令集后,导航回OpenCV-android-sdk \ apk并找到要在Android设备上安装的正确的apk版本和指令集。

然后,您可以将apk传输到您的设备并进行安装。 我觉得有用的另一种方法是导航到adb.exe目录并运行命令:

 ./adb.exe install /apk/OpenCV_x.y.z_Manager_x.yz_.apk 

除了上述步骤之外,请确保您没有使用其他类型的OpenCV Manager的任何其他环境变量,例如在Application.mk或build.gradle文件中声明其他类型。

完成上述步骤后,您的Canny探测器应能够在您的设备上运行而不会崩溃。

关于将图像保存到图库的问题的第二部分,请参考适用于Android开发人员的Camera / Camera2 API的捕获图片部分: https : //developer.android.com/guide/topics/media/camera #捕捉画面

快乐发展:)。