文档章节

YUV转IPLImage(RGB)

abcijkxyz
 abcijkxyz
发布于 2016/08/06 11:59
字数 512
阅读 1
收藏 0

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

自己搞了一个大家看看

第一个是很笨的办法:

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


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

本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/11850717

abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
私信 提问

暂无文章

一个简单易用的Linux文本编辑器:nano的安装与使用

许多状况下咱们都必要编纂云主机里的文本情节,而现时用的比力多的文本编纂器是vim,这个估量许多人都以为很难用,这边伏笔VPS引荐一个简略易用的文本编纂器nano,比vim简略许多,很轻易上手...

shzwork
17分钟前
0
0
go recover

异常、错误常见语言处理 一般语言都有其错误处理方式,就以鄙人熟悉的php来距离吧。 PHP有多个级别的错误处理方式,以防止程序在还未正确执行完毕时,就造成了程序的提前结束。 try/catch/fi...

o0无忧亦无怖
35分钟前
0
0
玩转混合云+边缘计算,且看ZStack Mini!

文章导读:2019年4月16日,ZStack新品和合作伙伴战略发布会上,面向集团客户和边缘场景需求,ZStack重磅推出ZStack Mini超融合一体机(以下简称:ZStack Mini)和ZStack多云管理平台(以下简...

ZStack社区版
37分钟前
0
0
springboot 整合redis

springboot整合redis官方是有文档的: 英文看不懂可以翻译,代码应该看得懂, 这个是自动注入的。当然也可以xml注入,手动配置。 整合步骤: pom文件: <!-- spring boot web --> ...

jason_kiss
40分钟前
2
0
手机耗电问题,大部分是没有正确使用这个“锁”

当安卓设备闲置时,设备很快会进入休眠状态,以达到省电和减少CPU占用的目的。但有些应用在手机灭屏甚至系统休眠时,依然频繁占用CPU处理事件或唤醒屏幕提示用户消息,这类行为会导致手机耗电...

安卓绿色联盟
41分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部