在编写代码将需要处理YUV格从每个视频帧中提取,然后将其保存为图片。有两种常见的方法在线,第一种是通过opencv自带cvCvtColor,可是这样的方法有bug。得到的图片会泛白。另外一种方法是公式法。

法一:opencv自带cvCvtColor

说明:这样的方法会出现图片“泛白”。详细原因网上是说cvCvtColor这个函数左右协议不同,不太懂。

代码:

void FileWriteFrames(){char *filename = "E:\\openCV\\zhang\\yuvSource\\football_cif.yuv";ifstream readMe(filename, ios::in | ios::binary);  // 打开并读yuv数据IplImage *image, *rgbimg, *yimg, *uimg, *vimg, *uuimg, *vvimg;cvNamedWindow("yuv",CV_WINDOW_AUTOSIZE);rgbimg = cvCreateImage(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 3);image = cvCreateImage(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 3);yimg = cvCreateImageHeader(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 1);    // 亮度分量uimg = cvCreateImageHeader(cvSize(ISizeX/2, ISizeY/2), IPL_DEPTH_8U, 1);  // 这两个都是色度分量vimg = cvCreateImageHeader(cvSize(ISizeX/2, ISizeY/2), IPL_DEPTH_8U, 1);uuimg = cvCreateImage(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 1);vvimg = cvCreateImage(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 1);int nframes;for(nframes = 0; nframes < FCount; nframes ++){char nframesstr[20];readMe.read((char*)Y[nframes],ISizeX*ISizeY);//readMe.seekg(-ISizeX*ISizeY, ios::cur);//readMe.read((char*)buf[nframes],ISizeX*ISizeY+ISizeX/2*ISizeY/2+ISizeX/2*ISizeY/2);readMe.read((char*)buf[nframes],ISizeX/2*ISizeY/2);readMe.read((char*)buf2[nframes],ISizeX/2*ISizeY/2);cvSetData(yimg,Y[nframes],ISizeX);//cvSetData(uimg,buf[nframes] + ISizeX*ISizeY, ISizeX/2);cvSetData(uimg,buf[nframes], ISizeX/2);cvSetData(vimg,buf2[nframes], ISizeX/2);cvResize(uimg,uuimg, CV_INTER_LINEAR);cvResize(vimg,vvimg, CV_INTER_LINEAR);cvMerge(yimg,uuimg,vvimg,NULL,image);   // 合并单通道为三通道cvCvtColor(image,rgbimg,CV_YUV2BGR);    stringstream ss;  // 类型转换统一转换为char* 类型ss << nframes;ss << ".jpg" ;ss >> nframesstr;cvShowImage("yuv", rgbimg);cvSaveImage(nframesstr,rgbimg);int c = cvWaitKey(30);if((char)c == 27){break;}}readMe.close();cvReleaseImage(&uuimg);cvReleaseImage(&vvimg);cvReleaseImageHeader(&yimg);cvReleaseImageHeader(&uimg);cvReleaseImageHeader(&vimg);cvReleaseImage(&image);cvDestroyWindow("yuv");
}

法二:公式法

代码:

bool YUV420_To_BGR24(unsigned char *puc_y, unsigned char *puc_u, unsigned char *puc_v, unsigned char *puc_rgb, int width_y, int height_y)
{if (!puc_y || !puc_u || !puc_v || !puc_rgb){return false;}//初始化变量int baseSize = width_y * height_y;int rgbSize = baseSize * 3;BYTE* rgbData  = new BYTE[rgbSize];memset(rgbData, 0, rgbSize);/* 变量声明 */int temp = 0;BYTE* rData = rgbData;                  //r分量地址BYTE* gData = rgbData + baseSize;       //g分量地址BYTE* bData = gData   + baseSize;       //b分量地址int uvIndex =0, yIndex =0;//YUV->RGB 的转换矩阵//double  Yuv2Rgb[3][3] = {1, 0, 1.4022,//    1, -0.3456, -0.7145,//    1, 1.771,   0};for(int y=0; y < height_y; y++){for(int x=0; x < width_y; x++){uvIndex        = (y>>1) * (width_y>>1) + (x>>1);yIndex         = y * width_y + x;/* r分量 */temp          = (int)(puc_y[yIndex] + (puc_v[uvIndex] - 128) * 1.4022);rData[yIndex] = temp<0 ?

0 : (temp > 255 ? 255 : temp); /* g分量 */ temp = (int)(puc_y[yIndex] + (puc_u[uvIndex] - 128) * (-0.3456) + (puc_v[uvIndex] - 128) * (-0.7145)); gData[yIndex] = temp < 0 ? 0 : (temp > 255 ?

255 : temp); /* b分量 */ temp = (int)(puc_y[yIndex] + (puc_u[uvIndex] - 128) * 1.771); bData[yIndex] = temp < 0 ? 0 : (temp > 255 ? 255 : temp); } } //将R,G,B三个分量赋给img_data int widthStep = width_y*3; for (int y = 0; y < height_y; y++) { for (int x = 0; x < width_y; x++) { puc_rgb[y * widthStep + x * 3 + 2] = rData[y * width_y + x]; //R puc_rgb[y * widthStep + x * 3 + 1] = gData[y * width_y + x]; //G puc_rgb[y * widthStep + x * 3 + 0] = bData[y * width_y + x]; //B } } if (!puc_rgb) { return false; } delete [] rgbData; return true; } IplImage* YUV420_To_IplImage(unsigned char* pYUV420, int width, int height) { if (!pYUV420) { return NULL; } //初始化变量 int baseSize = width*height; int imgSize = baseSize*3; BYTE* pRGB24 = new BYTE[imgSize]; memset(pRGB24, 0, imgSize); /* 变量声明 */ int temp = 0; BYTE* yData = pYUV420; //y分量地址 BYTE* uData = pYUV420 + baseSize; //u分量地址 BYTE* vData = uData + (baseSize>>2); //v分量地址 if(YUV420_To_BGR24(yData, uData, vData, pRGB24, width, height) == false || !pRGB24) { return NULL; } IplImage *image = cvCreateImage(cvSize(width, height), 8,3); memcpy(image->imageData, pRGB24, imgSize); if (!image) { return NULL; } delete [] pRGB24; return image; } void FileWriteFrames(){ char *filename = "E:\\openCV\\zhang\\yuvSource\\FOOTBALL_352x288_30_orig_01.yuv"; ifstream readMe(filename, ios::in | ios::binary); // 打开并读yuv数据 int nframes; for(nframes = 0; nframes < FCount; nframes ++){ char nframesstr[20]; readMe.read((char*)Y[nframes],ISizeX*ISizeY); readMe.seekg(-ISizeX*ISizeY, ios::cur); readMe.read((char*)buf[nframes],ISizeX*ISizeY+ISizeX/2*ISizeY/2+ISizeX/2*ISizeY/2); IplImage *rgbimg = YUV420_To_IplImage(buf[nframes], ISizeX, ISizeY); stringstream ss; // 类型转换统一转换为char* 类型 ss << nframes; ss << ".jpg" ; ss >> nframesstr; cvShowImage("yuv", rgbimg); cvSaveImage(nframesstr,rgbimg); int c = cvWaitKey(30); if((char)c == 27) { break; } } readMe.close(); }

完整代码见:http://download.csdn.net/detail/lu597203933/7362687

參见blog:http://blog.csdn.net/dreamd1987/article/details/7259479#

版权声明:本文博客原创文章,博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/mengfanrong/p/4676621.html

YUV格式转换RGB(基于opencv)相关推荐

  1. 图片YUV格式与RGB格式的转换

    YUV格式与RGB格式的转换 YUV格式介绍 YUV420.YUV422.YUV444 (1) YUV4:2:0 (2) YUV4:2:2 (3) YUV4:4:4 内存排列方式 YUV与RGB转换 ...

  2. opencv-python的格式转换 RGB与BGR互转

    opencv-python的格式转换 RGB与BGR互转 2018年04月17日 22:53:23 yuanlulu 阅读数:1753更多 个人分类: pythonopencv 版权声明:本文为博主原 ...

  3. YUV 格式与 RGB 格式的相互转换公式总结(C++版)

    YUV 格式与 RGB 格式的相互转换公式 最近在用的一个工业相机,输出的图像格式是 YUY2 格式.而在电脑上显示时需要 RGB 格式,所以就花了些时间在网上查了些相关的资料.说实话,网上关于 YU ...

  4. yuv格式转换是那个组织定义的_YUV格式

    在前几篇介绍了OpenGL几种2D效果(旋转.平移.缩放.滤镜)后可以看到,GL图像颜色空间是用R.G.B.A,也就是红.绿.蓝 加一个透明度通道来表示的.比如,gl_FragColor 通常在取值的 ...

  5. yuv显卡转换rgb

    该文是转载:原文地址: http://blog.csdn.net/wangchenggggdn/archive/2010/07/05/5713075.aspx 首先要感谢ffmpeg, 如果没有它,所 ...

  6. 音视频封装格式转换器(支持avi格式转换),基于FFmpeg4.1实现(音视频学习笔记二)

    之前参照雷霄骅博士的最简单的基于FFMPEG的封装格式转换器(无编解码)的博客和FFmpeg官网的example,实现一个简单的封装格式转换器.但是后来我发现我想从mp4格式转换成avi格式的时候会报 ...

  7. 【OpenCV】将图像数据由YUV格式转换成JPG格式直接使用,而不保存成文件

    解决方法 使用OpenCV图像编码和解码函数:imencode.imdecode std::vector data_encode; imencode(".png", img_enc ...

  8. yuv格式转换是那个组织定义的_AI 如何赋能摄像机?这场沙龙为你解锁“软件定义”新概念...

    在数字经济的发展中,数据基础设施将发挥关键支撑作用,机器视觉是数据基础设施非常重要的一环.当前 65% 的行业数字化信息来自视频,可见机器视觉与生活.娱乐.通信.生产.安全的深度结合下,一个千亿美元的 ...

  9. python实现按键精灵之颜色格式转换RGB vs HEX

    def rgb2hex(rgbcolor):'''RGB转HEX:param rgbcolor: RGB颜色元组,Tuple[int, int, int]:return: str'''r, g, b ...

最新文章

  1. 【Python】轻松识别文字,这款Python OCR库支持超过80种语言
  2. python有道翻译-利用python写一个有道翻译的脚本
  3. java时间戳转calender_Java获取当前时间,时间戳转换为时间格式 | 学步园
  4. 误删/usr/bin/python2.7解决方案
  5. go的goroutine像水一样自然
  6. RTT时钟管理篇——RTT定时器超时判断理解
  7. Spring Boot集成RabbitMQ发送接收JSON
  8. 力扣-1128 等价多米诺骨牌对的数量
  9. bugzilla dbd-mysql_Redhat 搭建bugzilla平台
  10. 用计算机算sin的按键顺序是什么,用计算器求sin50°的值,按键顺序是 [ ]A.B.C.D....
  11. WhatsApp营销与引流是怎么进行的?
  12. 中年网络工程师如何转型?
  13. Android攻城狮ViewFlipper
  14. linux查看网络流量 命令,linux查看流量命令
  15. 技术人从职场中脱颖而出的成长秘诀
  16. 关于AD9361的配置与测试,万能测试模板
  17. 计算机 修改 虚拟ip,怎么样在电脑中设置虚拟IP地址?
  18. Q.me推出! Amortech展示了它的卡尔加里软件开发技能
  19. SQL Server developer和enterprise有什么区别?以及各个版本的定义
  20. 注意力机制QKV理解

热门文章

  1. idal 创建springboot 项目_SpringBoot教程:Maven方式创建SpringBoot项目
  2. 仪表板断面_【干货】内外饰断面设计规范
  3. mysql查询缓存到redis_php查询mysql并缓存到redis
  4. idea mysql错误提示_idea提示错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  5. dubbo 自定义路由_Dubbo分层架构概述
  6. linux子系统安装gromacs,科学网—Windows下GROMACS程序的编译 - 李继存的博文
  7. (DAG+固定终点的最长路和最短路)硬币问题
  8. mysql慢查询日志轮转_MySQL slow log相关参数解释
  9. suse linux 创建用户密码,suse linux上创建用户方式
  10. java自学笔记_JAVA自学笔记(4)