http://www.2cto.com/kf/201208/145559.html

http://www.opencv.org.cn/forum.php?mod=viewthread&tid=645&extra=

第一个是很笨的办法:

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 = (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的代码:
[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

yuv转opencv中的IplImage的更多相关文章

  1. Opencv 中透视变换函数对IplImage图像变换时出现的问题?

    最近一直在做视频稳像的项目,为了简化部分实现,使用了部分Opencv的函数,其中包括Opencv中对IplImage进行同时变换的函数cvWarpPerspective(src, dst,...) 发 ...

  2. 使用GDI+显示OpenCV中的图像IplImage

    OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...

  3. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  4. OpenCV中IplImage图像格式与BYTE图像数据的转换

    最近在将Karlsruhe Institute of Technology的Andreas Geiger发表在ACCV2010上的Efficent Large-Scale Stereo Matchin ...

  5. openCV中IplImage的使用

    http://blog.csdn.net/welcome_xu/article/details/7650680 IplImage结构详细分析   IplImage 结构解读: typedef stru ...

  6. OpenCV中IplImage和Mat间的相互转换

    OpenCV中做图像处理经常用到IplImage和Mat间的相互转换. 首先,cv::Mat是opencv2.0中的数据类型:IplImage是opencv1.0中的类型,两种类型并不相同. 1. I ...

  7. OpenCV 中的三大数据类型:IplImage 类型

    前言 本文将介绍 OpenCV 中的图像结构 IplImage 并提供一些很实用的技巧. 更多的矩阵处理函数还请参阅相关资料. IplImage 的类型定义 typedef struct _IplIm ...

  8. OpenCV中IplImage/CvMat/Mat转化关系

    原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...

  9. 图像金字塔及其在 OpenCV 中的应用范例(下)

    前言 本文将主要讲解如何使用 OpenCV 实现图像分割,这也是图像金字塔在 OpenCV 中的一个重要应用. 关于图像分割 在计算机视觉领域,图像分割(Segmentation)指的是将数字图像细分 ...

随机推荐

  1. 更改系统环境设置,让alias永远生效

        alias(中文称为“别名”)允许使用更加简短的名称来重新定义 Linux 中的 Shell 命令,从而简化命令行的输入.如果经常与 CLI 打交道,那么使用 alias 不仅会节省时间,而且 ...

  2. Consul实现原理系列文章2: 用Gossip来做集群成员管理和消息广播

    工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.这篇文章会讲述Consul是如何使用Gossip来做集群成员管理和消息广播的. Consul使用Go ...

  3. 第一百九十七节,jQuery EasyUI,LinkButton(按钮)组件

    jQuery EasyUI,LinkButton(按钮)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 LinkButton(按钮)组件的使用方法,这个组 ...

  4. windows无法设置防火墙

    无法打开防火墙,出现错误代码0x80070422,解决方法:windows开始键->运行->调出运行窗口,输入services.msc,(或者控制面板->管理工具->服务)找到 ...

  5. Linux命令之umask

    一 权限掩码umask umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读( ...

  6. MEF笔记 之延迟加载

    文章参考:在MEF中实现延迟加载部件  作者:TianFang 仅有一个服务提供者时候 using System; using System.Collections.Generic; using Sy ...

  7. poj 3189(枚举+多重匹配)

    题目链接:http://poj.org/problem?id=3189 思路:由于题目要求最小的差值,而Range最多也才20,因此我们可以枚举上下限,多重匹配验证即可. http://paste.u ...

  8. c语言 常用知识点

    强制类型转换 (int)(x+y) 输入 scanf("a=%f,b=%f",&a,&b);  a=1,b=1 char a; a=getchar(); 输入一个字 ...

  9. iphone断点下载,断点续传

    本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6650469 - (void)loadView { NSURLConnection ...

  10. C# Static修饰符的作用

    MSDN上的定义 Use the static modifier to declare a static member, which belongs to the type itself rather ...