`

YUV转IPLImage(RGB)

 
阅读更多

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

自己搞了一个大家看看

第一个是很笨的办法:

yuv三个分量分别写在3个矩阵下,然后合并之后转换为rgb分量的图片格式就可以了;

代码如下:

 

[html]view plaincopy
 
  1. IplImage*image,*rgbimg,*yimg,*uimg,*vimg,*uuimg,*vvimg;
  2. rgbimg=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3);
  3. image=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3);
  4. yimg=cvCreateImageHeader(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
  5. uimg=cvCreateImageHeader(cvSize(nWidth/2,nHeight/2),IPL_DEPTH_8U,1);
  6. vimg=cvCreateImageHeader(cvSize(nWidth/2,nHeight/2),IPL_DEPTH_8U,1);
  7. uuimg=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
  8. vvimg=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
  9. cvSetData(yimg,pBuf,nWidth);
  10. cvSetData(uimg,pBuf+nWidth*nHeight,nWidth/2);
  11. cvSetData(vimg,pBuf+long(nWidth*nHeight*1.25),nWidth/2);
  12. cvResize(uimg,uuimg,CV_INTER_LINEAR);
  13. cvResize(vimg,vvimg,CV_INTER_LINEAR);
  14. cvMerge(yimg,uuimg,vvimg,NULL,image);
  15. cvCvtColor(image,rgbimg,CV_YCrCb2BGR);
[html]view plaincopy
 
  1. IplImage*image,*rgbimg,*yimg,*uimg,*vimg,*uuimg,*vvimg;
  2. rgbimg=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3);
  3. image=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3);
  4. yimg=cvCreateImageHeader(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
  5. uimg=cvCreateImageHeader(cvSize(nWidth/2,nHeight/2),IPL_DEPTH_8U,1);
  6. vimg=cvCreateImageHeader(cvSize(nWidth/2,nHeight/2),IPL_DEPTH_8U,1);
  7. uuimg=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
  8. vvimg=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
  9. cvSetData(yimg,pBuf,nWidth);
  10. cvSetData(uimg,pBuf+nWidth*nHeight,nWidth/2);
  11. cvSetData(vimg,pBuf+long(nWidth*nHeight*1.25),nWidth/2);
  12. cvResize(uimg,uuimg,CV_INTER_LINEAR);
  13. cvResize(vimg,vvimg,CV_INTER_LINEAR);
  14. cvMerge(yimg,uuimg,vvimg,NULL,image);
  15. cvCvtColor(image,rgbimg,CV_YCrCb2BGR);


还有一个方法就比较复杂

 

 

 

首先自己根据原理转换为rgb格式

然后利用cvSetData()函数写入数据生成IplImage格式的图片

首先定义转换的公式:

 

[html]view plaincopy
 
  1. #defineMR(Y,U,V)(Y+(1.403)*(V-128))
  2. #defineMG(Y,U,V)(Y-(0.344)*(U-128)-(0.714)*(V-128))
  3. #defineMB(Y,U,V)(Y+((1.773)*(U-128)))
[html]view plaincopy
 
  1. #defineMR(Y,U,V)(Y+(1.403)*(V-128))
  2. #defineMG(Y,U,V)(Y-(0.344)*(U-128)-(0.714)*(V-128))
  3. #defineMB(Y,U,V)(Y+((1.773)*(U-128)))


yuv转rgb的函数:

 

 

 

 

[html]view plaincopy
 
  1. voidYUV420_C_RGB(char*pYUV,unsignedchar*pRGB,intheight,intwidth)
  2. {
  3. char*pY=pYUV;
  4. char*pU=pYUV+height*width;
  5. char*pV=pU+(height*width/4);
  6. unsignedchar*pBGR=NULL;
  7. unsignedcharR=0;
  8. unsignedcharG=0;
  9. unsignedcharB=0;
  10. charY=0;
  11. charU=0;
  12. charV=0;
  13. doubletmp=0;
  14. for(inti=0;i<height;++i)
  15. {
  16. for(intj=0;j<width;++j)
  17. {
  18. pBGR=pRGB+i*width*3+j*3;
  19. Y=*(pY+i*width+j);
  20. U=*pU;
  21. V=*pV;
  22. //B
  23. tmp=MB(Y,U,V);
  24. //B=(tmp>255)?255:(char)tmp;
  25. //B=(B<0)?0:B;
  26. B=(unsignedchar)tmp;
  27. //G
  28. tmp=MG(Y,U,V);
  29. //G=(tmp>255)?255:(char)tmp;
  30. //G=(G<0)?0:G;
  31. G=(unsignedchar)tmp;
  32. //R
  33. tmp=MR(Y,U,V);
  34. //R=(tmp>255)?255:(char)tmp;
  35. //R=(R<0)?0:R;
  36. R=(unsignedchar)tmp;
  37. *pBGR=R;
  38. *(pBGR+1)=G;
  39. *(pBGR+2)=B;
  40. if(i%2==0&&j%2==0)
  41. {
  42. *pU++;
  43. //*pV++;
  44. }
  45. else
  46. {
  47. if(j%2==0)
  48. {
  49. *pV++;
  50. }
  51. }
  52. }
  53. }
  54. }
[html]view plaincopy
 
  1. voidYUV420_C_RGB(char*pYUV,unsignedchar*pRGB,intheight,intwidth)
  2. {
  3. char*pY=pYUV;
  4. char*pU=pYUV+height*width;
  5. char*pV=pU+(height*width/4);
  6. unsignedchar*pBGR=NULL;
  7. unsignedcharR=0;
  8. unsignedcharG=0;
  9. unsignedcharB=0;
  10. charY=0;
  11. charU=0;
  12. charV=0;
  13. doubletmp=0;
  14. for(inti=0;i<height;++i)
  15. {
  16. for(intj=0;j<width;++j)
  17. {
  18. pBGR=pRGB+i*width*3+j*3;
  19. Y=*(pY+i*width+j);
  20. U=*pU;
  21. V=*pV;
  22. //B
  23. tmp=MB(Y,U,V);
  24. //B=(tmp>255)?255:(char)tmp;
  25. //B=(B<0)?0:B;
  26. B=(unsignedchar)tmp;
  27. //G
  28. tmp=MG(Y,U,V);
  29. //G=(tmp>255)?255:(char)tmp;
  30. //G=(G<0)?0:G;
  31. G=(unsignedchar)tmp;
  32. //R
  33. tmp=MR(Y,U,V);
  34. //R=(tmp>255)?255:(char)tmp;
  35. //R=(R<0)?0:R;
  36. R=(unsignedchar)tmp;
  37. *pBGR=R;
  38. *(pBGR+1)=G;
  39. *(pBGR+2)=B;
  40. if(i%2==0&&j%2==0)
  41. {
  42. *pU++;
  43. //*pV++;
  44. }
  45. else
  46. {
  47. if(j%2==0)
  48. {
  49. *pV++;
  50. }
  51. }
  52. }
  53. }
  54. }


最后是写入IplImage的代码:

 

 

 

 

[html]view plaincopy
 
  1. unsignedchar*pRGB=NULL;
  2. pRGB=(unsignedchar*)malloc(nSize*sizeof(unsignedchar*)*2);
  3. YUV420_C_RGB(pBuf,pRGB,nWidth,nHeight);
  4. IplImage*image;
  5. image=cvCreateImageHeader(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3);
  6. cvSetData(image,pRGB,nWidth*3);
[html]view plaincopy
 
  1. unsignedchar*pRGB=NULL;
  2. pRGB=(unsignedchar*)malloc(nSize*sizeof(unsignedchar*)*2);
  3. YUV420_C_RGB(pBuf,pRGB,nWidth,nHeight);
  4. IplImage*image;
  5. image=cvCreateImageHeader(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3);
  6. cvSetData(image,pRGB,nWidth*3);

程序都运行过

 

 

 

编译环境为vs2008

opencv2.0版本

 

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

分享到:
评论

相关推荐

    YUV格式转为IplImage

    YUV和IplImage是两种不同的图像表示格式,它们各自有着特定的应用场景和优缺点。本文将深入探讨YUV到IplImage的转换过程,以及这一转换的重要性。 YUV格式是一种广泛应用于视频编码和解码中的颜色空间,它将图像的...

    YUV422转RGB888 FPGA Verilog纯逻辑代码

    本话题聚焦于一个具体的FPGA设计案例:将YUV422格式的视频数据转换为RGB888格式,这是一种常见的颜色空间转换。下面将详细解释这个过程以及涉及的技术知识点。 首先,YUV422是一种常见的颜色编码格式,主要用于存储...

    linux摄像头程序含yuv422转rgb565程序

    linux摄像头程序含yuv422转rgb565程序(在程序里面),网上搜的yuv422转rgb24 自己修改了下 程序没整理 比较乱

    YUV转RGB 的verilog代码

    在数字视频处理领域,颜色空间转换是至关重要的一步,它涉及到不同颜色模型之间的转换,例如从YUV转换到RGB。YUV色彩空间主要用于电视和视频信号传输,因为它能有效地利用带宽,而RGB(红绿蓝)是显示器上常用的色彩...

    YUV422转RGB

    把保存在文件中的YUV422数据转成RGB彩图,这是转换成opencv的RGB数据排列格式。

    yuv422格式转rgb格式

    本篇文章将深入探讨如何将YUV422格式的图像转换为8位RGB灰度图像,这是一个在视频处理、图像编码与解码等场景中常见的需求。 ### YUV422格式简介 YUV422是一种常见的彩色图像格式,其中“Y”代表亮度信号,“U”和...

    YUV420与RGB24转换

    YUV420和RGB24是两种常见的颜色模型,它们在不同的场景下各有优势。本文将深入探讨这两种颜色模型的特性和转换过程。 首先,让我们了解YUV420。这是一种为节省存储空间和带宽而设计的颜色模型,广泛应用于视频编码...

    Unity yuv转rgb shader 视频纹理转换

    本项目提供的"Unity yuv转rgb shader 视频纹理转换"是一个高效的解决方案,它利用GPU的并行计算能力,在运行时将YUV数据转换为RGB数据,从而在Window、iOS和Android平台上流畅地播放视频。 首先,我们需要理解YUV和...

    YUV 和 RGB 颜色互转的小工具

    本篇文章将深入探讨YUV和RGB两种颜色模型,以及如何进行它们之间的转换。我们也将介绍一个自编的小工具,它包含了实现这种转换的源码,方便进行测试和实际应用。 **一、YUV颜色空间** YUV是电视和视频系统中广泛...

    字符叠加及YUV420转RGB

    字符叠加通常用于在视频或图像上添加文本信息,如时间戳、水印或者标题,而YUV420到RGB的颜色空间转换则是图像显示和处理的基础步骤,因为不同的设备和系统可能采用不同的颜色表示方式。下面将详细阐述这两个知识点...

    python实现yuv转RGB图片程序

    YUV和RGB是两种广泛使用的颜色模型。YUV主要用于视频和电视信号传输,因为它可以节省带宽,而RGB则是计算机图形中最常用的颜色模型,它代表红、绿、蓝三种颜色。本篇文章将深入探讨如何使用Python进行YUV到RGB的转换...

    YUV420图像数据转换成RGB888和RGB565位图文件

    将YUV420图像数据转换成RGB888和RGB565位图文件;包含YUV420解码算法;YUV数据到RGB数据的转换算法;生成RGB888位图和RGB565位图的BITMAP文件格式算法;相关算法与函数都有详细的注释信息。

    yuv420转rgb

    海康威视sdk中,将视频流转换为图像,并可以将图像转换为视频流的方法。

    TI YUV422 TO RGB565

    TI YUV422到RGB565的转换是图像处理中的一个重要环节,尤其是在嵌入式系统和移动设备中,由于资源限制,这种颜色空间的转换经常被用于节省存储空间和带宽。在这个过程中,我们需要了解YUV色彩空间和RGB色彩空间的...

    RGB转YUV 转RGB为YUV

    RGB到YUV颜色空间转换是图像处理和视频编码领域中的常见操作。RGB(红绿蓝)是显示器上使用的颜色模型,而YUV(亮度、色差U、色差V)则常用于视频压缩和传输,因为它的结构可以更有效地利用带宽。下面将详细介绍RGB...

    C# YUV数据转RGB转bitmap图源码,保证能用

    综上所述,"C# YUV数据转RGB转bitmap图源码"涉及到的知识点包括YUV和RGB颜色模型、YUV到RGB的色彩空间转换、C# Bitmap类的使用以及从视频流中提取帧数据的技巧。掌握这些技能对于处理视频捕获、图像处理和多媒体应用...

    YUV转成RGB

    在提供的文件列表中,`YUV4202RGB32.cpp`和`YUV4202RGB32.h`很可能是实现YUV420到RGB32转换的C++源代码和头文件。它们可能包含了上述步骤的实现,包括插值算法和色彩空间转换函数。在实际应用中,这样的函数可以接收...

    YUV420转RGB源代码

    * YUV420转RGB源代码(c语言编写) Converter of IYUV to RGB24.

    YUV_RGB.rar_RGB CODE_RGB YUV_RGB 转 YUV_YUV转RGB_转RGB

    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 到 RGB24 格式转换算法 在图像处理和显示领域中, YUV422 是一种常见的图像格式,它的特点是每个像素点由两个字节表示,其中一个字节表示 Y 分量,另一个字节表示 UV 分量交叉存储。然而,在 LCD 显示器上,...

Global site tag (gtag.js) - Google Analytics