一個小的程式,在網上找了很久沒有發現
自己搞了一個大家看看
第一個是很笨的辦法:
yuv三個分量分別寫在3個矩陣下,然後合并之後轉換為rgb分量的圖片格式就可以了;
代碼如下:
IplImage *image,*rgbimg,*yimg,*uimg,*vimg,*uuimg,*vvimg;rgbimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);image = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3); yimg = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);uimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1);vimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1); uuimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);vvimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1); cvSetData(yimg,pBuf, nWidth);cvSetData(uimg,pBuf+nWidth*nHeight, nWidth/2);cvSetData(vimg,pBuf+long(nWidth*nHeight*1.25), nWidth/2);cvResize(uimg,uuimg,CV_INTER_LINEAR);cvResize(vimg,vvimg,CV_INTER_LINEAR); cvMerge(yimg,uuimg,vvimg,NULL,image);cvCvtColor(image,rgbimg,CV_YCrCb2BGR);
還有一個方法就比較負載
首先自己根據原理轉換為rgb格式
然後利用cvSetData()函數寫入資料產生IplImage格式的圖片
首先定義轉換的公式:
#define MR(Y,U,V) (Y + (1.403)*(V-128))#define MG(Y,U,V) (Y - (0.344) * (U-128) - (0.714) * (V-128) ) #define MB(Y,U,V) (Y + ((1.773) * (U-128)))
yuv轉rgb的函數:
void YUV420_C_RGB( char* pYUV, unsigned char* pRGB, int height, int width){ char* pY = pYUV; char* pU = pYUV+height*width; char* pV = pU+(height*width/4); unsigned char* pBGR = NULL; unsigned char R = 0; unsigned char G = 0; unsigned char B = 0; char Y = 0; char U = 0; char V = 0; double tmp = 0; for ( int i = 0; i < height; ++i ) { for ( int j = 0; j < width; ++j ) { pBGR = pRGB+ i*width*3+j*3; Y = *(pY+i*width+j); U = *pU; V = *pV; //B tmp = MB(Y, U, V); //B = (tmp > 255) ? 255 : (char)tmp; //B = (B<0) ? 0 : B;B = (unsigned char)tmp; //G tmp = MG(Y, U, V); //G = (tmp > 255) ? 255 : (char)tmp; // G = (G<0) ? 0 : G;G = (unsigned char)tmp; //R tmp = MR(Y, U, V); //R = (tmp > 255) ? 255 : (char)tmp; //R = (R<0) ? 0 : R;R = (unsigned char)tmp; *pBGR = R; *(pBGR+1) = G; *(pBGR+2) = B; if ( i%2 == 0 && j%2 == 0) { *pU++;//*pV++; } else { if ( j%2 == 0 ) { *pV++ ; }} } }}
最後是寫入IplImage的代碼:
unsigned char* pRGB = NULL;pRGB = (unsigned char*)malloc(nSize*sizeof(unsigned char*)*2);YUV420_C_RGB(pBuf,pRGB,nWidth,nHeight);IplImage *image;image = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);cvSetData(image,pRGB,nWidth*3);
程式都運行過
編譯環境為vs2008
opencv2.0版本