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));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章