YUV12(420) (from)to RGB24
直接上代码
#include <opencv2/opencv.hpp>
#include <stdio.h> #define min(a,b) ((a<b)?a:b)
#define max(a,b) ((a>b)?a:b)
/************************************************************************/
/* YUV12 to RGB24 (4) Basic Optimizations 3.1 */
/************************************************************************/
int yuv420_to_argb888(const unsigned char *y, const unsigned char *u,const unsigned char *v ,int width ,int height ,unsigned char *rgb)
{
static const int Precision = 32768 ;
static const int Coefficient_y = (int) (1.164*Precision + 0.5);
static const int Coefficient_rv = (int) (1.596*Precision + 0.5);
static const int Coefficient_gu = (int) (0.391*Precision + 0.5);
static const int Coefficient_gv = (int) (0.813*Precision + 0.5);
static const int Coefficient_bu = (int) (2.018*Precision + 0.5);
static int CoefficientY[256];
static int CoefficientRV[256];
static int CoefficientGU[256];
static int CoefficientGV[256];
static int CoefficientBU[256];
static int _CoefficientsR[1024];
//static int _CoefficientsG[1024];
//static int _CoefficientsB[1024];
static int flag = 1 ; if (flag)
{ for(int i =0;i<256;i++)
{
CoefficientY[i] = Coefficient_y *(i - 16) + (Precision/2);
CoefficientGV[i] = -Coefficient_gv *(i - 128);
CoefficientBU[i] = Coefficient_bu *(i - 128);
CoefficientGU[i] = -Coefficient_gu *(i - 128);
CoefficientRV[i] = Coefficient_rv *(i - 128);
} for(int j=0;j<1024;j++)
{
_CoefficientsR[j] = min((max(j-320,0)),255) ;
//_CoefficientsG[j] = min((max(j-320,0)),255) ;
//_CoefficientsB[j] = min((max(j-320,0)),255) ;
} flag = 0;
}
CoefficientY[0] = -593888;
CoefficientY[1] = -555746; //修复bug!! CoefficientY[1]在第二次进入此函数的时候意外被改动为非常大的数,理论值应该为-555746
int *CoefficientsR = &_CoefficientsR[320];
// int *CoefficientsG = &_CoefficientsG[320];
// int *CoefficientsB = &_CoefficientsB[320]; for ( int h=0;h<height;h++)
{ for (int w=0;w<width;w++)
{
int k = h*width + w;
int index = k*3;
int i = (h/2)*(width/2)+(w/2);
int Y = y[k];
int U = u[i];
int V = v[i]; //3.3 Optimizations Removing Conditional Tests
int r = CoefficientY[Y] + CoefficientRV[V];
int g = CoefficientY[Y] + CoefficientGU[U]+ CoefficientGV[V];
int b = CoefficientY[Y] + CoefficientBU[U];
rgb[index] = CoefficientsR[r/Precision];
rgb[index+1] = CoefficientsR[g/Precision];
rgb[index+2] = CoefficientsR[b/Precision]; }
}
return 0;
}
//Compare 3 images histograms together,
// the first is divided in half along y to test its other half
// Call is:
// ch7HistCmp modelImage0 testImage1 testImage2 badImage3
// Note that the model image is split in half. Top half(0) makes model. It's then tested
// against its lower half(0), testImages 1 and 2 in different lighting and different object 3
//
int main( int argc, char** argv ) { IplImage* src[5], *tmp;
int i;
if((src[0] = cvLoadImage(argv[1], 1)) == 0){ //We're going to split this one in half
printf("Error on reading image 1, %s\n",argv[1]);
return(-1);
}
//Parse the first image into two image halves divided halfway on y
printf("Getting size [[%d] [%d]] format is [%s]\n",src[0]->width,src[0]->height,src[0]->channelSeq);
CvSize size = cvGetSize(src[0]);
printf("Get size %d %d\n",size.width,size.height);
int width = size.width;
int height = size.height;
int halfheight = height >> 1;
//RGB888 to YUV420
unsigned char * rgb = (unsigned char*)src[0]->imageData;
unsigned char * yuv = (unsigned char*)malloc(width*height + width*height/2);
unsigned char * y = yuv;
unsigned char * u = &yuv[width*height];
unsigned char * v = &yuv[width*height+width*height/4]; int k = 0;
for(int i = 0;i<height ;i++)
{
for(int j =0;j<width;j++)
{
int index = i*width+j;
unsigned char R = rgb[width*i*3+j*3];
unsigned char G = rgb[width*i*3+j*3+1];
unsigned char B = rgb[width*i*3+j*3+2];
y[index] = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
y[index] = min(max(y[index],0),255); if( (j%2 ==0)&&(i%2 == 0) )
{
k++;
u[k] = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
v[k] = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128;
u[k] = min(max(u[k],0),255);
v[k] = min(max(v[k],0),255);
}
}
} src[1] = cvCreateImage(cvSize(width,height), 8, 3);
yuv420_to_argb888((const unsigned char*)y,(const unsigned char*)u,(const unsigned char*)v,width,height,(unsigned char *)src[1]->imageData); //DISPLAY
cvNamedWindow( "Source0", 1 );
cvShowImage( "Source0", src[0] );//原图RGB
cvNamedWindow( "Source1", 1 );
cvShowImage( "Source1", src[1] );//经过RGB88->YUV420->RGB888后的图像 cvWaitKey(0);
free(yuv) }
YUV12(420) (from)to RGB24的更多相关文章
- linux之x86裁剪移植---ffmpeg的H264解码显示(420、422)
在虚拟机上yuv420可以正常显示 ,而945(D525)模块上却无法显示 ,后来验证了directdraw的yuv420也无法显示 ,由此怀疑显卡不支持 ,后把420转换为422显示. 420显示如 ...
- etlpy: 并行爬虫和数据清洗工具(开源)
etlpy是python编写的网页数据抓取和清洗工具,核心文件etl.py不超过500行,具备如下特点 爬虫和清洗逻辑基于xml定义,不需手工编写 基于python生成器,流式处理,对内存无要求 内置 ...
- Kafka 0.9+Zookeeper3.4.6集群搭建、配置,新Client API的使用要点,高可用性测试,以及各种坑 (转载)
Kafka 0.9版本对java client的api做出了较大调整,本文主要总结了Kafka 0.9在集群搭建.高可用性.新API方面的相关过程和细节,以及本人在安装调试过程中踩出的各种坑. 关于K ...
- 【position也可以很复杂】当弹出层遇上了鼠标定位(下)
前言 接着昨天的内容写,为了保证内容连续性,这里还是把昨天的内容拷了过来. 请用现代浏览器测试 引出问题 有图有真相,我们来看一个智联招聘里面经常出现的图层: 他这个是没有什么问题的,我们来简单看看其 ...
- (转)Rest介绍
参考文献:Rest简介 REST是一种组织Web服务的架构,其只在架构方面提出了一系列约束. 关于Restful的无状态 所以在stackoverflow中,我们常常会看到有人问:我现在使用了这样一种 ...
- OCJP(1Z0-851) 模拟题分析(一)11
Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...
- 《利用python进行数据分析》读书笔记--第十一章 金融和经济数据应用(一)
自2005年开始,python在金融行业中的应用越来越多,这主要得益于越来越成熟的函数库(NumPy和pandas)以及大量经验丰富的程序员.许多机构发现python不仅非常适合成为交互式的分析环境, ...
- Python_sklearn机器学习库学习笔记(三)logistic regression(逻辑回归)
# 逻辑回归 ## 逻辑回归处理二元分类 %matplotlib inline import matplotlib.pyplot as plt #显示中文 from matplotlib.font_m ...
- 建模算法(八)——插值
插值:求过已知有限个数据点的近似函数 拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下在这些点的误差最小 (一)插值方法 一.拉格朗日多项式插值 1.插值多项式 就是做出一个 ...
随机推荐
- 【Python实例二】BeautifulSoup爬虫简单实践
前言 前面安装了BeautifulSoup库,现在就来实现一下吧. 目录 一.Urllib库的使用 二.BeautifulSoup的使用 三. 一个示例 ----------------------- ...
- Selenium IDE安装和检查获取的控件路径技巧
来源:http://www.jianshu.com/p/0ea2dc83549f 从学习Selenium 开始,都是自己写脚本,后来得知有个插件Selenium IDE可以录制脚本,也懒得用了,觉得自 ...
- 使用Github官方提供的gitignore过滤Git提交的文件
https://github.com/github/gitignore 在Gitignore项目主页找到VisualStudio.gitignore 下载后放到自己项目根目录的.vs文件夹提交就可以在 ...
- Selenium2+python自动化-窗口多标签处理方法总结(转载)
本篇转自博客:上海-小T 原文地址:https://i.cnblogs.com/EditArticles.aspx?opt=1 我们在用Selenium遇到多个浏览器窗口或单个浏览器多个标签(Tab) ...
- mySQL的存储过程详解
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
- ubuntu 启动 重启 停止 apache
一.Start Apache 2 Server /启动apache服务 # /etc/init.d/apache2 start or $ sudo /etc/init.d/apache2 start ...
- POJ 2492 A Bug's Life【并查集高级应用+类似食物链】
Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes ...
- 关于 hibernate 中 hashCode爆栈的探讨
今天在 hibernate 的一对多映射测试 merge 方法时,出现了以下的异常: 我们可以看到,这里的错误有非常明显的重复性,很显然是做了间接递归,并且递归的调用是 hashMap 中的hashC ...
- Cocos2dx-Lua UIScrollView 和 UITableView 对比
为什么写这个 上面这个问题的答案也是我写这篇文章的初衷,在最近给游戏添加一些列表的时候,对比着应用了一下他们两个,在它们两个之间的优劣势之间进行取舍,就有了这个问题的答案. 按照我一个iOS开发而言, ...
- LCA+差分【CF191C】Fools and Roads
Description 有一颗 \(n\) 个节点的树,\(k\) 次旅行,问每一条边被走过的次数. Input 第一行一个整数 \(n\) (\(2\leq n\leq 10^5\)). 接下来 \ ...