在嵌入式系统,或者是用作库的接口时,yuv图像一般都是char*的格式,而在进行图像处理的时候我们一般都是使用OpenCV的Mat格式。本文记录的是将YUV420SP(planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)从char*转为Mat格式以及从Mat格式转为char*。
-
char*转为Mat格式
(1)灰度图像的转换
大多数时候,我们图像处理为了减小计算量,使用灰度图像。以下示例,假设图像宽高分别为iWidth,iHeight,图像数据为chr* yuvData,转换如下:
cv::grayImg(iHeight,iWidth,CV_8UC1,yuvData);
(2)彩色图像的转换
//读取
fIn.read((char*)YUVFrameBuff, size*sizeof(unsigned char));
cv::Mat scrImg(288*3/2, 352, CV_8UC1);
memcpy(scrImg.data,YUVFrameBuff, size*sizeof(unsigned char));
cv::Mat bgrImg;
cv::cvtColor(scrImg, bgrImg, CV_YUV2BGR_I420);
cv::namedWindow("bgrImg");
cv::imshow("bgrImg", bgrImg);
cv::waitKey(10);
需要注意的是,如果不使用memcpy,而采用直接cv::Mat scrImg(288*3/2, 352, CV_8UC1,YUVFrameBuff);的方法,转换出来图像全灰,不知道是什么原因。
-
Mat格式转char*
(1)灰度图像的转换
灰度图像Mat转char*,我们直接使用scrImg.data指针即可。(2)彩色图像的转换
unsigned char* pYuvBuf;
pYuvBuf = new unsigned char[2073600];//最大图像为1080P
cv::Mat yuvImg;
cv::cvtColor(srcImg, yuvImg, CV_BGR2YUV_I420);
memcpy(pYuvBuf, yuvImg.data, bufLen*sizeof(unsigned char));