首页 > 解决方案 > 如何使用 OpenCV 在 Android 中将原始图像转换为 RGB?

问题描述

我需要对每个原始帧进行一些处理并将其显示在预览中。这是我正在使用的代码(在 Kotlin 中):

fun Image.toLinearRgb(): Mat {
    val bayer16Bit = Mat(height, width, CvType.CV_16UC1, planes[0].buffer)
    val bayer8Bit = Mat().apply {
        bayer16Bit.convertTo(this, CvType.CV_8UC1, 0.0625)
    }
    val rgb8Bit = Mat().apply {
        Imgproc.cvtColor(bayer8Bit, this, Imgproc.COLOR_BayerGR2RGB)
    }
    bayer16Bit.release()
    bayer8Bit.release()
    return rgb8Bit
}

我最终得到了一个带有很多绿色像素的奇怪 rgb 帧。

根据文档,原始图像(通过 ImageFormat.RAW_SENSOR)是 16 位、单通道、bayered 的。我可能遗漏了一些东西,因为仅在 CV_16UC1 垫子中分配字节缓冲区并将其转换为 RGB 不起作用。此外,即使对于线性色彩空间,生成的帧似乎也太暗了。我会很感激任何帮助!

标签: androidimage-processingkotlinopencv3.0opencv4android

解决方案


有不同的拜耳图案布局,在不知道相机布局的情况下,我猜你弄错了。Opencv通过左上角的前2种颜色来指代它们:cv::COLOR_BayerBG2BGR

在 opencv 中,这些是通过使用不同的标志来支持的:

cv::COLOR_BayerRG2BGR
cv::COLOR_BayerGR2BGR
cv::COLOR_BayerGB2RGB

...ETC。可以在此处找到完整列表:https ://docs.opencv.org/3.1.0/de/d25/imgproc_color_conversions.html

您可以尝试研究您平台的拜耳布局,或者您可以尝试直到它起作用。祝你好运!


推荐阅读