【问题标题】:Why does this Mat returned by rgba() method appear to have BGR format rather than RGBA format?为什么 rgba() 方法返回的这个 Mat 似乎具有 BGR 格式而不是 RGBA 格式?
【发布时间】:2015-12-09 14:08:40
【问题描述】:

我在几个地方(sourcesource)读到 OpenCV 默认使用 BGR 颜色格式。

但我正在编写一个类来检测图像中某种颜色(红色)的斑点(遵循Color Blob Detection sample)。所以在onCameraFrame(CvCameraViewFrame inputFrame) 函数中,我们返回值inputFrame.rgba()。根据documentation

rgba() 这个方法返回 RGBA Mat 和框架

所以我假设我的rgbaFrame(在我的程序中存储inputFrame.rgba() 的值的变量)包含RGBA 格式的Mat。

但是当我运行应用程序时,原始图像中的红色在我写入外部 SD 卡的rgbaFrame Mat 中显得偏蓝。 显然,Mat 是 BGR 格式,因为红色看起来是蓝色的。(这在 comments of this question. 中进行了讨论)

所以我改变了我的cvtColorfunction

Imgproc.cvtColor(rgbaFrame, hsvImage, Imgproc.COLOR_RGB2HSV_FULL);

Imgproc.cvtColor(rgbaFrame, hsvImage, Imgproc.COLOR_BGR2HSV_FULL);

但是当我运行程序时没有任何改变。原始图像中的红色在捕获的帧中仍显示为蓝色。

所以现在我正在寻找一种将 RGB 转换为 BGR 格式的方法,尝试看看这是否有助于解决我的问题。但是一直没能找到。 如何将 BGR 转换为 RGB? 如果您对我有任何其他建议,请分享。

  • 捕获相机帧的原始屏幕截图:

  • rgbaFrame.jpg(因为我做了Highgui.imwrite("/mnt/sdcard/DCIM/rgbaFrame.jpg", rgbaFrame);//check

【问题讨论】:

  • 好吧,rgbaFramecvtColor 之后将保持不变,因为您将结果写入hsvImage。你能告诉我们hsvImage 的结果如何吗?
  • @DmitryZaitsev 哦,是的,你可以看到所有的图片和代码here in this question.。如果您认为我也应该在这个问题中发布图片,请告诉我。
  • @DmitryZaitsev 和我更改为 Imgproc.cvtColor(rgbaFrame, hsvImage, Imgproc.COLOR_BGR2HSV_FULL); 是基于 rgbaFrame 已经是 BGR 格式的假设。 Imgproc.cvtColor(rgbaFrame, hsvImage, Imgproc.COLOR_BGR2HSV_FULL); 函数只是将 BGR 颜色空间更改为 HSV 颜色空间吧?
  • @DmitryZaitsev 请不要对我指出的另一个问题感到困惑,标有“(2)”的问题已经解决了。您可以在问题的编辑中看到 HSV 图像。
  • 您可以使用 COLOR_BGR2RGB 或类似方法将 bgr 转换为 rgb,反之亦然。但是,您似乎正在保存 HSV 图像。在这种情况下,您需要将图像转换回 bgr 才能保存

标签: android opencv image-processing opencv3.0 opencv4android


【解决方案1】:

OpenCV 默认使用 BGR,然而,Android frame.rgba() 实现返回 RGB(可能是为了符合 imageview 和其他 Android 组件)。但是,OpenCV 函数imwrite 仍然需要 BGR,因此如果您保存图像而不先将其转换为 BGR,则蓝色和红色通道将被错误保存(交换),因为帧的 Mat 文件在索引 0 中具有红色通道(RGB) 而imwrite 将索引 0 写入蓝色 (BGR)。同样,框架在索引 2 中具有蓝色通道,而 imwrite 将索引 2 写入红色。在保存到文件之前,您可以使用COLOR_RGB2BGR 调用cvtcolor

/**
 * Callback method that is called on every frame of the CameraBridgeViewBase class of OpenCV
 */
override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame?): Mat {
    inputFrame?.let { currentFrame ->

        val currentFrameMat = currentFrame.rgba()

            // save the RGB2BGR converted version
            val convertedMat = Mat()
            Imgproc.cvtColor(currentFrameMat, convertedMat, Imgproc.COLOR_RGB2BGR)
            Imgcodecs.imwrite(imageFilePath, convertedMat)
        
        return currentFrameMat
    }
    return Mat()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多