一个小的程序,在网上找了很久没有发现
自己搞了一个大家看看
第一个是很笨的办法:
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);
- 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格式的图片
首先定义转换的公式:
- #defineMR(Y,U,V)(Y+(1.403)*(V-128))
- #defineMG(Y,U,V)(Y-(0.344)*(U-128)-(0.714)*(V-128))
- #defineMB(Y,U,V)(Y+((1.773)*(U-128)))
- #defineMR(Y,U,V)(Y+(1.403)*(V-128))
- #defineMG(Y,U,V)(Y-(0.344)*(U-128)-(0.714)*(V-128))
- #defineMB(Y,U,V)(Y+((1.773)*(U-128)))
yuv转rgb的函数:
- voidYUV420_C_RGB(char*pYUV,unsignedchar*pRGB,intheight,intwidth)
- {
- char*pY=pYUV;
- char*pU=pYUV+height*width;
- char*pV=pU+(height*width/4);
- unsignedchar*pBGR=NULL;
- unsignedcharR=0;
- unsignedcharG=0;
- unsignedcharB=0;
- charY=0;
- charU=0;
- charV=0;
- doubletmp=0;
- for(inti=0;i<height;++i)
- {
- for(intj=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=(unsignedchar)tmp;
- //G
- tmp=MG(Y,U,V);
- //G=(tmp>255)?255:(char)tmp;
- //G=(G<0)?0:G;
- G=(unsignedchar)tmp;
- //R
- tmp=MR(Y,U,V);
- //R=(tmp>255)?255:(char)tmp;
- //R=(R<0)?0:R;
- R=(unsignedchar)tmp;
- *pBGR=R;
- *(pBGR+1)=G;
- *(pBGR+2)=B;
- if(i%2==0&&j%2==0)
- {
- *pU++;
- //*pV++;
- }
- else
- {
- if(j%2==0)
- {
- *pV++;
- }
- }
- }
- }
- }
- voidYUV420_C_RGB(char*pYUV,unsignedchar*pRGB,intheight,intwidth)
- {
- char*pY=pYUV;
- char*pU=pYUV+height*width;
- char*pV=pU+(height*width/4);
- unsignedchar*pBGR=NULL;
- unsignedcharR=0;
- unsignedcharG=0;
- unsignedcharB=0;
- charY=0;
- charU=0;
- charV=0;
- doubletmp=0;
- for(inti=0;i<height;++i)
- {
- for(intj=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=(unsignedchar)tmp;
- //G
- tmp=MG(Y,U,V);
- //G=(tmp>255)?255:(char)tmp;
- //G=(G<0)?0:G;
- G=(unsignedchar)tmp;
- //R
- tmp=MR(Y,U,V);
- //R=(tmp>255)?255:(char)tmp;
- //R=(R<0)?0:R;
- R=(unsignedchar)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的代码:
- unsignedchar*pRGB=NULL;
- pRGB=(unsignedchar*)malloc(nSize*sizeof(unsignedchar*)*2);
- YUV420_C_RGB(pBuf,pRGB,nWidth,nHeight);
- IplImage*image;
- image=cvCreateImageHeader(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3);
- cvSetData(image,pRGB,nWidth*3);
- unsignedchar*pRGB=NULL;
- pRGB=(unsignedchar*)malloc(nSize*sizeof(unsignedchar*)*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
相关推荐
YUV422转RGB888 FPGA Verilog纯逻辑代码 支持1920x1080
linux摄像头程序含yuv422转rgb565程序(在程序里面),网上搜的yuv422转rgb24 自己修改了下 程序没整理 比较乱
这个是yuv格式转为IplImage格式代码。目前网上的都有各种问题,这个绝对没有。
YUV转RGB 的verilog代码。实现方法采用查表法,经过验证。
把保存在文件中的YUV422数据转成RGB彩图,这是转换成opencv的RGB数据排列格式。
YUV420与RGB24之间转换,ConvertYUV2RGB,
在YUV420格式上实现字符叠程序加及YUV420转RGB程序,已实现
YUV转RGB
海康威视sdk中,将视频流转换为图像,并可以将图像转换为视频流的方法。
python实现yuv转RGB图片程序,更多说明访问我的博客https://blog.csdn.net/bvngh3247
RGB转YUV 转RGB为YUV
将yuv422格式的图像转为8位rgb灰度图像
* YUV420转RGB源代码(c语言编写) Converter of IYUV to RGB24.
RGB转YUV YUV转RGB C语言代码
YUV 和 RGB 颜色互转的小工具 自己写的,最近用到了YUV色彩,网上很多算法,可是都不甚完美,花了两天才弄明天,写个小工具,内涵源码,方便测试和使用。
YUV转RGB程序,RGB TO YUV转换原理及代码
YUV2RGB.dll,VC++把YUV转换成RGB的算法,提供了很好的API封装,调用非常方便!压缩包内是VC++源文件。
YUV420转RGB播放器,支持帧率、分辨率设置,滚动条拖动,双缓存技术防止屏幕闪烁;最大化,最小化,全屏显示,可以控制控件跟随对话框改变;拖拽文件到对话框
通过gles实现硬件编码rgb转yuv 或者yuv转rgb 效率非常高
抓取摄像机视频流一帧的YUV数据,转RGB转bitmap图的类,从现项目中剥离的,保证能用 。