一个小的程序,在网上找了很久没有发现
自己搞了一个大家看看
第一个是很笨的办法:
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
相关推荐
YUV和IplImage是两种不同的图像表示格式,它们各自有着特定的应用场景和优缺点。本文将深入探讨YUV到IplImage的转换过程,以及这一转换的重要性。 YUV格式是一种广泛应用于视频编码和解码中的颜色空间,它将图像的...
本话题聚焦于一个具体的FPGA设计案例:将YUV422格式的视频数据转换为RGB888格式,这是一种常见的颜色空间转换。下面将详细解释这个过程以及涉及的技术知识点。 首先,YUV422是一种常见的颜色编码格式,主要用于存储...
linux摄像头程序含yuv422转rgb565程序(在程序里面),网上搜的yuv422转rgb24 自己修改了下 程序没整理 比较乱
在数字视频处理领域,颜色空间转换是至关重要的一步,它涉及到不同颜色模型之间的转换,例如从YUV转换到RGB。YUV色彩空间主要用于电视和视频信号传输,因为它能有效地利用带宽,而RGB(红绿蓝)是显示器上常用的色彩...
把保存在文件中的YUV422数据转成RGB彩图,这是转换成opencv的RGB数据排列格式。
本篇文章将深入探讨如何将YUV422格式的图像转换为8位RGB灰度图像,这是一个在视频处理、图像编码与解码等场景中常见的需求。 ### YUV422格式简介 YUV422是一种常见的彩色图像格式,其中“Y”代表亮度信号,“U”和...
YUV420和RGB24是两种常见的颜色模型,它们在不同的场景下各有优势。本文将深入探讨这两种颜色模型的特性和转换过程。 首先,让我们了解YUV420。这是一种为节省存储空间和带宽而设计的颜色模型,广泛应用于视频编码...
本项目提供的"Unity yuv转rgb shader 视频纹理转换"是一个高效的解决方案,它利用GPU的并行计算能力,在运行时将YUV数据转换为RGB数据,从而在Window、iOS和Android平台上流畅地播放视频。 首先,我们需要理解YUV和...
本篇文章将深入探讨YUV和RGB两种颜色模型,以及如何进行它们之间的转换。我们也将介绍一个自编的小工具,它包含了实现这种转换的源码,方便进行测试和实际应用。 **一、YUV颜色空间** YUV是电视和视频系统中广泛...
字符叠加通常用于在视频或图像上添加文本信息,如时间戳、水印或者标题,而YUV420到RGB的颜色空间转换则是图像显示和处理的基础步骤,因为不同的设备和系统可能采用不同的颜色表示方式。下面将详细阐述这两个知识点...
YUV和RGB是两种广泛使用的颜色模型。YUV主要用于视频和电视信号传输,因为它可以节省带宽,而RGB则是计算机图形中最常用的颜色模型,它代表红、绿、蓝三种颜色。本篇文章将深入探讨如何使用Python进行YUV到RGB的转换...
将YUV420图像数据转换成RGB888和RGB565位图文件;包含YUV420解码算法;YUV数据到RGB数据的转换算法;生成RGB888位图和RGB565位图的BITMAP文件格式算法;相关算法与函数都有详细的注释信息。
海康威视sdk中,将视频流转换为图像,并可以将图像转换为视频流的方法。
TI YUV422到RGB565的转换是图像处理中的一个重要环节,尤其是在嵌入式系统和移动设备中,由于资源限制,这种颜色空间的转换经常被用于节省存储空间和带宽。在这个过程中,我们需要了解YUV色彩空间和RGB色彩空间的...
RGB到YUV颜色空间转换是图像处理和视频编码领域中的常见操作。RGB(红绿蓝)是显示器上使用的颜色模型,而YUV(亮度、色差U、色差V)则常用于视频压缩和传输,因为它的结构可以更有效地利用带宽。下面将详细介绍RGB...
综上所述,"C# YUV数据转RGB转bitmap图源码"涉及到的知识点包括YUV和RGB颜色模型、YUV到RGB的色彩空间转换、C# Bitmap类的使用以及从视频流中提取帧数据的技巧。掌握这些技能对于处理视频捕获、图像处理和多媒体应用...
在提供的文件列表中,`YUV4202RGB32.cpp`和`YUV4202RGB32.h`很可能是实现YUV420到RGB32转换的C++源代码和头文件。它们可能包含了上述步骤的实现,包括插值算法和色彩空间转换函数。在实际应用中,这样的函数可以接收...
* YUV420转RGB源代码(c语言编写) Converter of IYUV to RGB24.
4. **RGB到YUV转换**:与YUV到RGB相反,RGB到YUV的转换用于编码或压缩图像。基本公式如下: - Y = 0.299 * R + 0.587 * G + 0.114 * B - U = -0.1687 * R - 0.3313 * G + 0.5 * B + 128 - V = 0.5 * R - 0.4187 *...
YUV422 到 RGB24 格式转换算法 在图像处理和显示领域中, YUV422 是一种常见的图像格式,它的特点是每个像素点由两个字节表示,其中一个字节表示 Y 分量,另一个字节表示 UV 分量交叉存储。然而,在 LCD 显示器上,...