yuv轉opencv中的IplImage

來源:互聯網
上載者:User

一個小的程式,在網上找了很久沒有發現

自己搞了一個大家看看

第一個是很笨的辦法:

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版本

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.