使用OpenCV将12位拜耳图像转换为8位RGB

前端之家收集整理的这篇文章主要介绍了使用OpenCV将12位拜耳图像转换为8位RGB前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用OpenCV 2.3.1将12位拜耳图像转换为8位RGB图像.这似乎应该使用cvCvtColor函数相当简单,但是当我使用这个代码调用它时,该函数会抛出异常:
int cvType = CV_MAKETYPE(CV_16U,1);
cv::Mat bayerSource(height,width,cvType,sourceBuffer);
cv::Mat rgbDest(height,CV_8UC3);
cvCvtColor(&bayerSource,&rgbDest,CV_BayerBG2RGB);

我以为我在sourceBuffer的结尾运行,因为输入数据是12位,而且我不得不传递一个16位的类型,因为OpenCV没有12位类型.所以我将宽度和高度除以2,但是cvCvtColor仍然抛出一个没有任何有用的信息的异常(错误消息是“未知异常”).

几个月前发布了一个similar question,这是从来没有回答过,但是由于我的问题更具体地涉及到12位拜耳数据,所以我认为这是一个很大的区别,值得一个新的问题.

提前致谢.

编辑:我必须缺少一些东西,因为我甚至不能得到cvCvtColor函数来处理8位数据:

cv::Mat srcMat(100,100,CV_8UC3);
const cv::Scalar val(255,0);
srcMat.setTo(val);
cv::Mat destMat(100,CV_8UC3);
cvCvtColor(&srcMat,&destMat,CV_RGB2BGR);

解决方法

我可以使用以下代码将我的数据转换为8位RGB:
// Copy the data into an OpenCV Mat structure
cv::Mat bayer16BitMat(height,CV_16UC1,inputBuffer);

// Convert the Bayer data from 16-bit to to 8-bit
cv::Mat bayer8BitMat = bayer16BitMat.clone();
// The 3rd parameter here scales the data by 1/16 so that it fits in 8 bits.
// Without it,convertTo() just seems to chop off the high order bits.
bayer8BitMat.convertTo(bayer8BitMat,CV_8UC1,0.0625);

// Convert the Bayer data to 8-bit RGB
cv::Mat rgb8BitMat(height,CV_8UC3);
cv::cvtColor(bayer8Bit,rgb8BitMat,CV_BayerGR2RGB);

错误地认为,我从相机获取的12位数据被紧密打包,因此两个12位值包含在3个字节中.事实证明,每个值都包含在2个字节中,所以我没有必要做任何拆包,将我的数据放到OpenCV支持的16位数组中.

原文链接:https://www.f2er.com/css/214052.html

猜你在找的CSS相关文章