YUV格式转换RGB(基于opencv)

在编写代码将需要处理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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2 数据源配置_Spring, MyBatis 多数据源的配置和管理

作者&#xff1a;digdeep出处&#xff1a;https://www.cnblogs.com/digdeep/p/4512368.html热门推荐vuewebsocketSpringboot实现的即时通信开源项目springboot炸翔版CMS开源系统同一个项目有时会涉及到多个数据库&#xff0c;也就是多数据源。多数据源又可以分为两种情况&#…

(九十)使用多个storyboard+代码实现控制器的分开管理

使用单个storyboard会使得项目难与管理&#xff0c;使用纯代码又会过于麻烦&#xff0c;因此如果能将二者结合起来&#xff0c;并且使用多个storyboard&#xff0c;会使得项目简单简单、方便许多。 下面以一个简单的视图关系为例&#xff0c;介绍多个storyboard的用法。 ①有pa…

吗 支持windows_M1能否原生支持Windows 苹果把问题抛给了微软

关于苹果M1处理器近期已经有了非常多的报道&#xff0c;人们对其出色的性能表现以及较低的功耗还是充满了期待。那么最后一个也是最重要的一个问题&#xff0c;基于苹果M1处理器的电脑能原生支持微软Windows吗&#xff1f;毕竟很多人买回苹果MacBook第一件事就是安装Windows 10…

数据库设计五要点 让数据库设计更加规范

通常情况下&#xff0c;可以从两个方面来判断数据库是否设计的比较规范。一是看看是否拥有大量的窄表&#xff0c;二是宽表的数量是否足够的少。若符合这两个条件&#xff0c;则可以说明这个数据库的规范化水平还是比较高的。当然这是两个泛泛而谈的指标。为了达到数据库设计规…

4怎么放大字体_win8.1系统如何放大所有字体?

电脑安装上[color#070c0 !important]win8.1正式版系统&#xff0c;发现桌面的字体和网页的字体比较小&#xff0c;看起来比较吃力&#xff0c;从而影响操作。一般win8.1系统字体都默认设置好的&#xff0c;不过用户可以进行放大&#xff0c;那么win8.1系统怎么放大所有字体&…

进程 zabbix_Zabbix监控在windows的进程(非进程数)

场景介绍&#xff1a;小Z同学最近遇到个项目需求&#xff0c;需求是用zabbix监控运行在windows的进程。然鹅&#xff0c;当小Z同学在网上搜了一大堆&#xff0c;发现基本上都是使用官方的proc.num(***.exe)键值拿到进程数量&#xff0c;很显然&#xff0c;这并不符合客户实际的…

spring配置数据库

一.加载数据库驱动 1.利用hibernate.properties文件加载 <bean class"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   <property name"locations">     <list>       <value>classpath…

golang 切片 接口_如何理解Golang中的接口?

个人认为&#xff0c;要理解 Go 的接口&#xff0c;一定先了解下鸭子模型。鸭子模型那什么鸭子模型&#xff1f;鸭子模型的解释&#xff0c;通常会用了一个非常有趣的例子&#xff0c;一个东西究竟是不是鸭子&#xff0c;取决于它的能力。游泳起来像鸭子、叫起来也像鸭子&#…

batchnomal_pytorch的batch normalize使用详解

torch.nn.BatchNorm1d()1、BatchNorm1d(num_features, eps 1e-05, momentum0.1, affineTrue)对于2d或3d输入进行BN。在训练时&#xff0c;该层计算每次输入的均值和方差&#xff0c;并进行平行移动。移动平均默认的动量为0.1。在验证时&#xff0c;训练求得的均值/方差将用于标…

phpcms文件所需权限

转载于:https://www.cnblogs.com/zhongheng/p/4684087.html

mysql 设置大小写_mysql修改大小写参数注意事项

原由&#xff1a;数据库中原本参数lower_case_table_names的值为0&#xff0c;应开发要求需要修改为不区分大小写&#xff0c;即修改为1。但是修改完之后&#xff0c;发现本来建立的大写字母的表查不到。修改过程1&#xff0c;在参数文件中修改lower_case_table_names12&#x…

论文中如何写mysql的介绍_mysql优化写论文,从哪几方面入手啊解决方法

引用第7章&#xff1a;优化目录7.1. 优化概述7.1.1. MySQL设计局限与折衷7.1.2. 为可移植性设计应用程序7.1.3. 我们已将MySQL用在何处&#xff1f;7.1.4. MySQL基准套件7.1.5. 使用自己的基准7.2. 优化SELECT语句和其它查询7.2.1. EXPLAIN语法(获取SELECT相关信息)7.2.2. 估计…

如何理解java回电话

同android中间Button的setOnClickListener这个回调案例&#xff1b; Button button (Button)this.findViewById(R.id.button); button.setOnClickListener(new Button.OnClickListener() {//回调函数overridepublicvoid onClick(View v) {buttonTextView.setText("按钮被…

python mysql 时间比较大小_python时间函数与mysql时间函数转换

时间相关操作&#xff0c;时间有三种表示方式&#xff1a;时间戳 1970年1月1日之后的秒&#xff0c;即&#xff1a;time.time()格式化的字符串 2014-11-11 11:11&#xff0c; 即&#xff1a;time.strftime(%Y-%m-%d)结构化时间 元组包含了&#x…

springMVC 前后台日期格式传值解决方式之二(共二) @InitBinder的使用

关于springmvc日期问题的解决方式 除了本博客的【springMVC 前后台日期格式传值解决方式之 DateTimeFormat的使用和配置】一文&#xff0c; 还有如下这种方式: 在Controller里加上这段代码&#xff1a; 1 InitBinder2 public void initBinder(ServletRequestDataBinder…

mysql npe问题_MySQL为Null会导致5个问题,个个致命!

本文转载自微信公众号「Java中文社群」&#xff0c;作者磊哥。转载本文请联系Java中文社群公众号。正式开始之前&#xff0c;我们先来看下 MySQL 服务器的配置和版本号信息&#xff0c;如下图所示&#xff1a;“兵马未动粮草先行”&#xff0c;看完了相关的配置之后&#xff0c…

line-height 与垂直居中!

在此之前&#xff0c;对于line-height 与垂直居中的问题&#xff0c;经常碰到。 比如&#xff0c;图片与span在同一个box中的时候&#xff0c;竟然会各种偏移。要想达到理想的效果真的是各种难。 有时间&#xff0c;决定认真的啃一啃。 一 line-heigtht: 1. line-height: 顾名…

暑假集训-个人赛第六场

这场比赛&#xff0c;不提也罢。 A转载于:https://www.cnblogs.com/macinchang/p/4693690.html

mysql优化插入速度的方法_优化MySQL插入方法的五个妙招

以下是涉及到插入表格的查询的5种改进方法&#xff1a;1)使用LOAD DATA INFILE从文本下载数据这将比使用插入语句快20倍。2)使用带有多个VALUES列表的INSERT语句一次插入几行这将比使用一个单行插入语句快几倍。调整bulk_insert_buffer_size变量也能提高(向包含行的表格中)插入…

数据结构导论(一)

导读&#xff1a;在看书前&#xff0c;我对这本书的内容&#xff0c;是 这么想的&#xff1a;数据结构&#xff0c;那大概就是关于数据和结构的东西。而讲到数据&#xff0c;估计会说到数据类型&#xff0c;数据定义&#xff0c;数据存储等方面。然后在结构方面&#xff0c;就不…