调用Imgproc.Canny函数时,Android App崩溃

时间:2017-05-24 16:18:05

标签: java android opencv image-processing computer-vision

我一直在开发一款可以检测瞳孔大小变化的应用。但是,目前我使用openCV库中的Canny函数停留在一段代码上。

    private void runOpenCVCode() {
        try {
            File imageFile = new File(locations.get(0));
            Uri uri = Uri.fromFile(imageFile);
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            Mat mat = Mat.zeros(100,400, CvType.CV_8UC3);
            Utils.bitmapToMat(bitmap, mat);
            //check mat
            Bitmap bm = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(mat, bm);
            pic.setImageBitmap(bm);

            Mat gray = new Mat(mat.size(), CvType.CV_8UC1);
            Imgproc.cvtColor(mat, gray, Imgproc.COLOR_BGR2GRAY, 4);

            Bitmap bmGray = Bitmap.createBitmap(gray.cols(), gray.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(gray, bmGray);
            pic.setImageBitmap(bmGray);

            Mat edges = gray;
            double thresh = Imgproc.threshold(gray, edges, 0, 255, Imgproc.THRESH_OTSU);
            Imgproc.Canny(gray, edges, 80, 100);

            Bitmap bmEdges = Bitmap.createBitmap(edges.cols(), edges.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(edges, bmEdges);
            pic.setImageBitmap(bmEdges);
        } catch (IOException e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        }
    }

代码运行正常,直到它命中canny函数调用。如果它被注释掉,其余的运行没有问题。我假设它是本机崩溃,因为应用程序崩溃而日志中没有任何错误,并直接回到初始活动。我已经尝试将矩阵实例化为灰色和边缘各种方式,并使用不同的阈值,但似乎没有任何工作。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我已回答了类似的问题:https://stackoverflow.com/a/50637228/1693327但由于缺乏声誉点,我无法评论该帖子,因此我将复制以下答案。

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

检查适用于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探测器应该能够在您的设备上运行而不会崩溃。

快乐发展:)。