我正在尝试通过以下步骤处理从 Android 的相机意图获得的 bmp 图像:
bmp
从意图中获取图像- 将
bmp
图像转换为Mat
对象以进行 OpenCV 处理(问题从这里开始) - 是否需要 OpenCV 处理(通过将
Mat
对象obj作为obj.getNativeObjAddr()
发送到本地处理,或在 java 中本地执行)。 - 将
Mat
对象转换回bmp
这个问题确实并不新奇。我在网上找到了无数类似的问题,但是似乎没有一个可以解决这种情况。
结果(问题)
目的是在对象中显示处理后的图像(经过上述 4 个步骤)ImageView
。运行后,ImageView 保持不变,logcat 在到达线路调用时发出以下警告Utils.bitmapToMat()
W/System.err(3872): java.lang.IllegalArgumentException: mat == null
代码
下面是onActivityResult
方法中使用的代码大纲(resultant_bmp
是从相机意图获取的bmp。它自己显示成功)。
filePath
是 . 的文件路径、名称和扩展名resultant_bmp
。
起始if
条件之后的前 3 行来自这里,在上述问题中它的使用似乎可以正常工作。
Bitmap resultant_bmp /*image from camera*/,
bmp /*image after opencv processing*/;
Mat rgb_img, gray_img;
if (OpenCVLoader.initDebug()) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.RGB_565;
resultant_bmp= BitmapFactory.decodeFile(filePath, options);
/****************** Problem starts HERE ******************
Last point reachable before Logcat states:
W/System.err(4460):java.lang.IllegalArgumentException: mat == null
After this point, the program doesn't crash, but expected results
in the imageView (last line of code) do not result.
**********************************************************/
Utils.bitmapToMat(resultant_bmp, rgb_img);
Imgproc.cvtColor(rgb_img, gray_img, Imgproc.COLOR_RGBA2GRAY);
/*Do opencv processing (on gray_img) here*/
Utils.matToBitmap(gray_img, bmp);
imageView.setImageBitmap(bmp);
}
以往的尝试和研究
- 我在这里发现了一个类似的问题,并按照建议尝试将文件推
libopencv_java.so
送到system/lib
设备上,在命令行中使用 adb 并收到错误:
failed to copy 'libopencv_java.so' to 'system/lib/libopencv_java.so': Read-only file system
System.loadLibrary("opencv_java");
System.loadLibrary("libopencv_java");
我已将 OpenCV 库添加到项目属性中;以及指示 NDK 根路径所在位置的 NDKROOT 变量,如此处进一步解释。
我已经在 OpenCV 的另一个工作示例中尝试了所需的图像处理(在上面的步骤 3 中),所以问题肯定出在步骤 2(上面)中;a
bmp
到Mat
对象的转换。
应该有一个简单的解决方案,但我似乎找不到它。如果可能的话,我们将不胜感激。
感谢您的时间。