首页前端开发HTMLyuv转opencv中的IplImage

yuv转opencv中的IplImage

时间2024-01-26 16:08:03发布访客分类HTML浏览237
导读:收集整理的这篇文章主要介绍了yuv转opencv中的IplImage,觉得挺不错的,现在分享给大家,也给大家做个参考。 第一个是很笨的办法: yuv三个分量分别写在3个矩阵下,然后合并之后转换为rgb分量的图片格式就可以了; 代码如下: [...
收集整理的这篇文章主要介绍了yuv转opencv中的IplImage,觉得挺不错的,现在分享给大家,也给大家做个参考。

第一个是很笨的办法:

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

代码如下:

[htML] 
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格式的图片

首先定义转换的公式:

[html]
#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的函数:
[html] 
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 = (B0) ? 0 : B;  
            B = (unsigned char)tmp;  
            //G 
            tmp = MG(Y, U, V);  
            //G = (tmp > 255) ? 255 : (char)tmp;  
           // G = (G0) ? 0 : G;  
            G = (unsigned char)tmp;  
            //R 
            tmp = MR(Y, U, V);  
            //R = (tmp > 255) ? 255 : (char)tmp;  
            //R = (R0) ? 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的代码:
[html] 
unsigned char* pRGB = NULL;  
 
pRGB = (unsigned char*)malloc(nSize*sizeof(unsigned char*)*2);  
     
YUV420_C_RGB(pBuf,pRGB,nWidth,nHeight);  
     
IplImage *image;  www.2cto.com
image = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);  
cvSetData(image,pRGB,nWidth*3);  
程序都运行过
编译环境为vs2008


作者:xuhongwei0411

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

HTML

若转载请注明出处: yuv转opencv中的IplImage
本文地址: https://pptw.com/jishu/586980.html
html5框架PhoneGap API详解(配完整笔记) HTML5断点续传

游客 回复需填写必要信息