yuv转opencv中的IplImage

原创 2012年02月14日 21:51:34


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

自己搞了一个大家看看

第一个是很笨的办法:

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


相关文章推荐

YUV转IPLImage(RGB)

原帖地址:http://blog.csdn.net/dreamd1987/article/details/7259479 一个小的程序,在网上找了很久没有发现 自己搞了一个大家看看 第一个是很笨...

YUV420数据转为IplImage格式

IplImage* YUV420_To_IplImage_Opencv(unsigned char* pYUV420, int width, int height) { if (!pYUV420)...

YUV420数据转为IplImage格式

1 YUV420理解     首先我们需要对YUV420的数据有一个了解,很多人对YUV数据格式不清楚,以至于在做视频的时候出现了一些不可预知的错误(比如说图像带有点、颜色不对等)。图文讲解, 在...

opencv读取yuv序列到opencv 1.0 图片格式IplImage

两种方式,一种通过cvCvtColor,一种通过自己写的转换子函数 出来的bmp完全相同 #include #include "cv.h" #include #defin...
  • qjj2857
  • qjj2857
  • 2015年02月06日 18:36
  • 384

YUV转IPLImage(RGB)

原帖地址:http://blog.csdn.net/dreamd1987/article/details/7259479 一个小的程序,在网上找了很久没有发现 自己搞了一个大家看看 第一个是很笨...
  • woxincd
  • woxincd
  • 2012年03月29日 08:55
  • 4418

YUV格式转为IplImage

  • 2014年10月18日 14:27
  • 48.3MB
  • 下载

OpenCV的IplImage转bmp

最近做项目,需要VB.NET调用,C++处理的图片。 如果c++处理的结果保存在磁盘上,然后Vb再读取的话,感觉过于占用磁盘IO,不绿色不环保。 因此想用内存映射文件的方式,进程之间传输图片。VB端先...

Emgu的Image(Of Gray,Byte)转OpenCV的IplImage

最近在做VB.Net和C++进程间的用内存映射文件通信的项目。 VB.NET和C++通信就需要传送统一的格式,让VB和C++都能解析。 我就遇到了这个问题:VB.NET,Emgu的Image(Of G...

OpenCV的IplImage与我的CHYBitmap的互转

一. CHYBitmap CHYBitmap是我自己读取bmp文件的一个类. 二. IplImage IplImage是OpenCV里管理图像的一个类.(经常被它的名称误导, 总以为它是...
  • cay22
  • cay22
  • 2015年06月17日 09:04
  • 607

opencv在iOS中的使用[几个滤波]以及uiimage与iplimage互转

最近由于项目需要用到美颜,因此初步使用了opencv进行了研究,思路如下: 1 使用滤波,可以采用双边滤波或者高斯滤波; 2 肤色检测; 3 图像的融合,即1和2点融合; 4 锐化增强细节...
  • tuyooc
  • tuyooc
  • 2016年03月31日 10:13
  • 768
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:yuv转opencv中的IplImage
举报原因:
原因补充:

(最多只允许输入30个字)