【问题标题】:Bitmap to Mat gives wrong colors backMat 的位图返回错误的颜色
【发布时间】:2019-05-06 04:43:39
【问题描述】:

所以我用下一个代码从一个 blob 制作位图:

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

它会返回下一个输出,这很好

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

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

我不知道为什么,也没有其他方法可以将位图变成 Mat。怎么了?

【问题讨论】:

  • 看起来蓝色和红色通道交换了。你确定你的 Mat 将图像存储为 RGB(Java 的默认值)而不是 BGR(Opencv 的默认值)
  • 关于这个问题的任何更新?
  • 您找到解决方案了吗?我也面临同样的问题。
  • 附带说明:1)我相信您的注释行更好 2)Mat ImageMat = new Mat(320, 240, CvType.CV_32F); 将分配一个不适合接收bitmapToMat 输出的矩阵,类型应为@987654328 @。巧合的是相同的字节数 :) 见 doc iopencv.com/docs/java/2.4.9/org/opencv/android/Utils.html

标签: java android bitmap mat


【解决方案1】:

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 通道完好无损。
  • 需要双重确认,但似乎Utils.bitmapToMat创建了RGB Mat。 (github.com/opencv/opencv/blob/master/modules/java/generator/src/…)
  • Imgproc.cvtColor(ImageMat, ImageMat, Imgproc.COLOR_BGR2RGB); 会占用大量 CPU 时间
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 2013-07-21
  • 2023-04-03
  • 2014-01-05
  • 2021-10-01
  • 2012-07-01
  • 1970-01-01
相关资源
最近更新 更多