我试图使用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位数组中.