将位图转换为Mat后颜色不正确

6

我使用下面的代码从 blob 中创建位图:

byte[] blob = contact.getMP();
ByteArrayInputStream inputStream = new ByteArrayInputStream(blob);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
Bitmap scalen = Bitmap.createScaledBitmap(bitmap, 320, 240, false);

并且它返回了下一个输出,这是很好的。

enter image description here

然后我执行以下操作将位图转换为 Mat,但是我的颜色只是改变了...

//Mat ImageMat = new Mat();
Mat ImageMat = new Mat(320, 240, CvType.CV_32F);
Utils.bitmapToMat(scalen, ImageMat);

我不知道为什么,也没有其他方法将位图转换为Mat。有什么问题吗? 在此输入图片描述


看起来蓝色和红色通道被交换了。你确定你的Mat是以RGB(Java默认)而不是BGR(Opencv默认)存储图像吗? - Max
这个问题有任何更新吗? - Ankur Gautam
你找到解决方案了吗?我也遇到了同样的问题。 - Muhammad Hassaan
作为附注:1)我认为你的注释行更好。2)Mat ImageMat = new Mat(320, 240, CvType.CV_32F);将分配一个矩阵,不适合接收bitmapToMat的输出,类型应为CV_8UC4。巧合的是,字节数相同 :)请参阅文档https://iopencv.com/docs/java/2.4.9/org/opencv/android/Utils.html - Antonio
1个回答

14
Android Bitmap中颜色通道的格式是RGB,但在OpenCV Mat中,默认情况下通道顺序是BGR。
因此,当使用Utils.bitmapToMat()函数时,[B,G,R]值存储在[R,G,B]通道中,红色和蓝色通道被交换了。
一个可能的解决方案是在OpenCV Mat上应用cvtColor函数,如下所示:Imgproc.cvtColor(ImageMat, ImageMat, Imgproc.COLOR_BGR2RGB); 对我而言,这个方法有效。

有趣的事实:将 Android.camera2 拍摄的 JPEG 转换为位图,然后再转换为矩阵时,它们的 RGB 通道保持不变。 - Sipty
需要进行双重确认,但似乎 Utils.bitmapToMat 创建了 RGB Mat。(https://github.com/opencv/opencv/blob/master/modules/java/generator/src/cpp/utils.cpp#L45) - JSong
1
Imgproc.cvtColor(ImageMat, ImageMat, Imgproc.COLOR_BGR2RGB); 这行代码会消耗大量的 CPU 时间。 - user924

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接