• YUV转IPLImage(RGB)


    一个小的程序,在网上找了很久没有发现

    自己搞了一个大家看看

    第一个是很笨的办法:

    yuv三个分量分别写在3个矩阵下,然后合并之后转换为rgb分量的图片格式就可以了;

    代码如下:

    [html] view plaincopy
    1. IplImage *image,*rgbimg,*yimg,*uimg,*vimg,*uuimg,*vvimg;  
    2.       
    3.     rgbimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);  
    4.     image = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);  
    5.       
    6.     yimg = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);  
    7.     uimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1);  
    8.     vimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1);  
    9.       
    10.     uuimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);  
    11.     vvimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);  
    12.       
    13.     cvSetData(yimg,pBuf, nWidth);  
    14.     cvSetData(uimg,pBuf+nWidth*nHeight, nWidth/2);  
    15.     cvSetData(vimg,pBuf+long(nWidth*nHeight*1.25), nWidth/2);  
    16.     cvResize(uimg,uuimg,CV_INTER_LINEAR);  
    17.     cvResize(vimg,vvimg,CV_INTER_LINEAR);  
    18.       
    19.     cvMerge(yimg,uuimg,vvimg,NULL,image);  
    20.     cvCvtColor(image,rgbimg,CV_YCrCb2BGR);  
    [html] view plaincopy
    1. IplImage *image,*rgbimg,*yimg,*uimg,*vimg,*uuimg,*vvimg;  
    2.       
    3.     rgbimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);  
    4.     image = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);  
    5.       
    6.     yimg = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);  
    7.     uimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1);  
    8.     vimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1);  
    9.       
    10.     uuimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);  
    11.     vvimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);  
    12.       
    13.     cvSetData(yimg,pBuf, nWidth);  
    14.     cvSetData(uimg,pBuf+nWidth*nHeight, nWidth/2);  
    15.     cvSetData(vimg,pBuf+long(nWidth*nHeight*1.25), nWidth/2);  
    16.     cvResize(uimg,uuimg,CV_INTER_LINEAR);  
    17.     cvResize(vimg,vvimg,CV_INTER_LINEAR);  
    18.       
    19.     cvMerge(yimg,uuimg,vvimg,NULL,image);  
    20.     cvCvtColor(image,rgbimg,CV_YCrCb2BGR);  

    还有一个方法就比较复杂

    首先自己根据原理转换为rgb格式

    然后利用cvSetData()函数写入数据生成IplImage格式的图片

    首先定义转换的公式:

    [html] view plaincopy
    1. #define MR(Y,U,V) (Y + (1.403)*(V-128))  
    2. #define MG(Y,U,V) (Y - (0.344) * (U-128) - (0.714) * (V-128) )   
    3. #define MB(Y,U,V) (Y + ((1.773) * (U-128)))  
    [html] view plaincopy
    1. #define MR(Y,U,V) (Y + (1.403)*(V-128))  
    2. #define MG(Y,U,V) (Y - (0.344) * (U-128) - (0.714) * (V-128) )   
    3. #define MB(Y,U,V) (Y + ((1.773) * (U-128)))  

    yuv转rgb的函数:

    [html] view plaincopy
    1. void YUV420_C_RGB( char* pYUV, unsigned char* pRGB, int height, int width)  
    2. {  
    3.     char* pY = pYUV;  
    4.     char* pU = pYUV+height*width;  
    5.     char* pV = pU+(height*width/4);  
    6.   
    7.   
    8.     unsigned char* pBGR = NULL;  
    9.     unsigned char R = 0;  
    10.     unsigned char G = 0;  
    11.     unsigned char B = 0;  
    12.     char Y = 0;  
    13.     char U = 0;  
    14.     char V = 0;  
    15.     double tmp = 0;  
    16.     for ( int i = 0; i < height; ++i )  
    17.     {  
    18.         for ( int j = 0; j < width; ++j )  
    19.         {  
    20.             pBGR = pRGB+ i*width*3+j*3;  
    21.   
    22.             Y = *(pY+i*width+j);  
    23.             U = *pU;  
    24.             V = *pV;  
    25.   
    26.             //B  
    27.             tmp = MB(Y, U, V);  
    28.             //B = (tmp > 255) ? 255 : (char)tmp;  
    29.             //B = (B<0) ? 0 : B;  
    30.             B = (unsigned char)tmp;  
    31.             //G  
    32.             tmp = MG(Y, U, V);  
    33.             //G = (tmp > 255) ? 255 : (char)tmp;  
    34.            // G = (G<0) ? 0 : G;  
    35.             G = (unsigned char)tmp;  
    36.             //R  
    37.             tmp = MR(Y, U, V);  
    38.             //R = (tmp > 255) ? 255 : (char)tmp;  
    39.             //R = (R<0) ? 0 : R;  
    40.             R = (unsigned char)tmp;  
    41.   
    42.   
    43.             *pBGR     = R;              
    44.             *(pBGR+1) = G;          
    45.             *(pBGR+2) = B;  
    46.           
    47.   
    48.             if ( i%2 == 0 && j%2 == 0)  
    49.             {  
    50.                 *pU++;  
    51.                 //*pV++;  
    52.             }  
    53.             else  
    54.             {  
    55.                 if ( j%2 == 0 )  
    56.                 {  
    57.                     *pV++ ;  
    58.                 }  
    59.             }  
    60.         }  
    61.       
    62.     }  
    63. }  
    [html] view plaincopy
    1. void YUV420_C_RGB( char* pYUV, unsigned char* pRGB, int height, int width)  
    2. {  
    3.     char* pY = pYUV;  
    4.     char* pU = pYUV+height*width;  
    5.     char* pV = pU+(height*width/4);  
    6.   
    7.   
    8.     unsigned char* pBGR = NULL;  
    9.     unsigned char R = 0;  
    10.     unsigned char G = 0;  
    11.     unsigned char B = 0;  
    12.     char Y = 0;  
    13.     char U = 0;  
    14.     char V = 0;  
    15.     double tmp = 0;  
    16.     for ( int i = 0; i < height; ++i )  
    17.     {  
    18.         for ( int j = 0; j < width; ++j )  
    19.         {  
    20.             pBGR = pRGB+ i*width*3+j*3;  
    21.   
    22.             Y = *(pY+i*width+j);  
    23.             U = *pU;  
    24.             V = *pV;  
    25.   
    26.             //B  
    27.             tmp = MB(Y, U, V);  
    28.             //B = (tmp > 255) ? 255 : (char)tmp;  
    29.             //B = (B<0) ? 0 : B;  
    30.             B = (unsigned char)tmp;  
    31.             //G  
    32.             tmp = MG(Y, U, V);  
    33.             //G = (tmp > 255) ? 255 : (char)tmp;  
    34.            // G = (G<0) ? 0 : G;  
    35.             G = (unsigned char)tmp;  
    36.             //R  
    37.             tmp = MR(Y, U, V);  
    38.             //R = (tmp > 255) ? 255 : (char)tmp;  
    39.             //R = (R<0) ? 0 : R;  
    40.             R = (unsigned char)tmp;  
    41.   
    42.   
    43.             *pBGR     = R;              
    44.             *(pBGR+1) = G;          
    45.             *(pBGR+2) = B;  
    46.           
    47.   
    48.             if ( i%2 == 0 && j%2 == 0)  
    49.             {  
    50.                 *pU++;  
    51.                 //*pV++;  
    52.             }  
    53.             else  
    54.             {  
    55.                 if ( j%2 == 0 )  
    56.                 {  
    57.                     *pV++ ;  
    58.                 }  
    59.             }  
    60.         }  
    61.       
    62.     }  
    63. }  

    最后是写入IplImage的代码:

    [html] view plaincopy
    1. unsigned char* pRGB = NULL;  
    2.   
    3. pRGB = (unsigned char*)malloc(nSize*sizeof(unsigned char*)*2);  
    4.       
    5. YUV420_C_RGB(pBuf,pRGB,nWidth,nHeight);  
    6.       
    7. IplImage *image;  
    8. image = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);  
    9. cvSetData(image,pRGB,nWidth*3);  
    [html] view plaincopy
    1. unsigned char* pRGB = NULL;  
    2.   
    3. pRGB = (unsigned char*)malloc(nSize*sizeof(unsigned char*)*2);  
    4.       
    5. YUV420_C_RGB(pBuf,pRGB,nWidth,nHeight);  
    6.       
    7. IplImage *image;  
    8. image = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);  
    9. cvSetData(image,pRGB,nWidth*3);  
    程序都运行过

    编译环境为vs2008

    opencv2.0版本


    原帖地址:http://blog.csdn.net/dreamd1987/article/details/7259479

  • 相关阅读:
    视图、触发器、事务、存储过程、函数,流程控制
    权限管理,pymysql模块
    单表查询
    sql逻辑查询语句的执行顺序
    Mysql数据库基础知识
    库,表,记录的相关操作
    并发编程之IO模型
    并发编程之协程
    并发编程之多线程
    事件委托
  • 原文地址:https://www.cnblogs.com/leixiaohua1020/p/3902210.html
Copyright © 2020-2023  润新知