0

我正在尝试通过以下步骤处理从 Android 的相机意图获得的 bmp 图像:

  1. bmp从意图中获取图像
  2. bmp图像转换为Mat对象以进行 OpenCV 处理(问题从这里开始)
  3. 是否需要 OpenCV 处理(通过将Mat对象obj作为obj.getNativeObjAddr()发送到本地处理,或在 java 中本地执行)。
  4. 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(上面)中;abmpMat对象的转换。

应该有一个简单的解决方案,但我似乎找不到它。如果可能的话,我们将不胜感激。

感谢您的时间。

4

1 回答 1

0

你初始化你的垫子变量了吗?我在提供的代码中找不到它。

在尝试转换为 mat 之前添加它。

Mat rgb_img = new Mat();
于 2013-01-29T10:41:25.750 回答