android - 如何使用 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 不起作用。此外,即使对于线性色彩空间,生成的帧似乎也太暗了。我会很感激任何帮助!
解决方案
有不同的拜耳图案布局,在不知道相机布局的情况下,我猜你弄错了。Opencv通过左上角的前2种颜色来指代它们:cv::COLOR_Bayer
BG2BGR
在 opencv 中,这些是通过使用不同的标志来支持的:
cv::COLOR_BayerRG2BGR
cv::COLOR_BayerGR2BGR
cv::COLOR_BayerGB2RGB
...ETC。可以在此处找到完整列表:https ://docs.opencv.org/3.1.0/de/d25/imgproc_color_conversions.html
您可以尝试研究您平台的拜耳布局,或者您可以尝试直到它起作用。祝你好运!
推荐阅读
- python - 如何读取多个图像文件夹?
- docker - 在 Docker 和 Jenkins 中运行测试框架的步骤
- java - 在 sql 查询中出现意外的 Token 错误
- javascript - JavaScript - jQuery.Tabledit 不适用于特定的 url
- pandas - 在缺少拆分模式之前的第一部分时拆分字符串列
- c++ - 输出 'external/name/x/lib/lib.so' 不是使用 bazel make 创建的
- javascript - 在 React 中正确使用状态
- swift - 使用队列和信号量进行并发和属性包装?
- c++ - 无论第二个用户输入在 switch 的第二种情况下,while 循环都会继续执行
- javascript - 如何检查用户的名字和姓氏是否在密码中?