@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.Canny_Edge) //Unfortunately stops the app when we use this option {
ImageView i = (ImageView) findViewById(R.id.image_view);
Bitmap bmp =BitmapFactory.decodeResource(getResources(),R.drawable.smiley);
Mat srcMat = new Mat ( bmp.getHeight(), bmp.getWidth(), CvType.CV_8UC3);
Bitmap myBitmap32 = bmp.copy(Bitmap.Config.ARGB_8888, true);
Utils.bitmapToMat(myBitmap32, srcMat);
Mat gray = new Mat(srcMat.size(), CvType.CV_8UC1);
Imgproc.cvtColor(srcMat, gray, Imgproc.COLOR_RGB2GRAY,4);
Mat edge = new Mat();
Mat dst = new Mat();
Imgproc.Canny(gray, edge, 80, 90);
Imgproc.cvtColor(edge, dst, Imgproc.COLOR_GRAY2RGBA,4);
Bitmap resultBitmap = Bitmap.createBitmap(dst.cols(), dst.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(dst, resultBitmap);
i.setImageBitmap(resultBitmap);
}
else if(id == R.id.Sobel) {
ImageView i = (ImageView) findViewById(R.id.image_view);
i.setImageResource(R.drawable.apj);
//some code
}
return super.onOptionsItemSelected(item);
}
在上面的代码中, Android工作室不会显示任何错误。 但应用程序不幸停止获取 Canny_Edge 选项(在菜单中)。 为什么,任何人都可以解决这个问题。
答案 0 :(得分:0)
我已回答了类似的问题:https://stackoverflow.com/a/50637228/1693327但由于缺乏声誉点,我无法评论该帖子,因此我将复制以下答案。
设备在执行Imgproc.Canny函数调用时应该崩溃。
我认为应用程序在遇到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探测器应该能够在您的设备上运行而不会崩溃。
快乐发展:)。