YUV420SP图像char*与OpenCV的Mat格式的相互转换

在嵌入式系统,或者是用作库的接口时,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*。
  1. 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);的方法,转换出来图像全灰,不知道是什么原因。

  1. 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));

你可能感兴趣的:(OpenCV)