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

时间:2017-12-04 17:35:56

标签: java android android-studio opencv

我是使用OpenCV的新手,当我尝试应用Canny探测器时,我的应用程序崩溃了。我已经看过另外一篇关于同样的帖子,但我试了一下,什么都没有......

我使用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方法?非常感谢你!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

设备在执行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 <path to OpenCV-android-sdk>/apk/OpenCV_x.y.z_Manager_x.yz_<platform instruction set>.apk

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

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

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

快乐发展:)。