天天看點

yuv圖像的存儲和rgb圖像的存儲

讀取一張rgb圖像

cv::Mat src = cv::imread("a.jpg", 1);

在opencv中會産生顔色相反的結果,是以使用之前轉一下顔色

cvtColor(src, src, CV_RGB2BGR);

我們需要用大小為3*width*height位元組的數組來存放一張 width*height大小的rgb圖像

unsigned char* rgb = new unsigned char[src.cols*src.rows*3];

注意src.cols就是width,src.rows就是height

如果是想用來儲存yuv的話,就需要大小是src.cols*src.rows*3/2個位元組的數組

unsigned char* yuv= new unsigned char[src.cols*src.rows*3/2];

注意3/2一定不要寫到最前面

unsigned char * dst_y = yuv ;

unsigned char * dst_u = yuv + src.cols*src.rows;

unsigned char * dst_v = dst_u + src.cols*src.rows/4;

假設現在我們通過rgb2yuv已經将yuv資料裝載到這個yuv首位址的數組裡了,我們來獲得這個yuv的檔案

std::FILE *f = NULL;

f = std::fopen("/data/dstall.yuv", "w+");

std::fwrite(yuvall, sizeof(char), src.rows * src.cols * 3/2, f);

現在我們想要通過顯示一張rgb圖像的方式來檢視一個yuv檔案的Y,U,V分布,于是我們先來定制這張圖像的大小

cv::Mat dstall = cv::Mat(src.rows*3/2, src.cols, CV_8U, yuv);

src.rows*3/2是指這張圖像的高度的位元組大小,src.cols是這張圖像的寬度位元組大小,要得到YUV圖像分布,需要采用

單通道CV_8U,yuv對應的圖像資料源位址。

如果我們是想獲得一張顯示圖像的rgb圖像呢.我們可以這樣做

cv::Mat cv::Mat dstRGB = cv::Mat(src.rows, src.cols, CV_8U3, rgbaddr);

最後将這個圖檔儲存起來

cv::imwrite("dest.png",dstRGB );

繼續閱讀