yuv420(planer) to bgr24 to bmp
项目中碰到了YUV420 planer格式转BGR24的要求(原文中写为RGB24,但实际应为BGR),BGR格式可直接应用于opencv,发现网上涉及这方面的内容不少,但能用的代码非常少,据说最新的opencv 已经可以实现这一功能,下面的代码在项目中可用,转换成功;
标记一下,防止以后再次用到;
unsigned char clip(int valid){
return valid<0 ? 0 : valid>255 ? 255 : valid;
}
void yuv2bgr(unsigned char *rgbout,unsigned char *yuvin, int width,int height){
int x,y;
int temp=0;
unsigned long idx=0;
unsigned char *ybase,*ubase,*vbase;
unsigned char Y,U,V;
//分别得到y、u、v分量的指针;planar format
ybase=yuvin;
ubase=ybase+width*height;
vbase=ubase+(width*height)/4;
for(y=0;y<Height;y++){
idx=(Height-y-1)*Width*3;//该值保证所生成的rgb数据逆序存放在rgbbuf中
//printf("this is %dth x and index is %d!!!!!!\n",x,idx);
for(x=0;x<Width;x++){
Y=ybase[y*Width+x];
U=ubase[(y/2)*(Width/2)+x/2];//注意UV分量的取值方法,y/2的含义
V=vbase[(y/2)*(Width/2)+x/2];
temp=(int)(Y+1.771*(U - 128));
rgbout[idx++]=clip(temp);
temp=(int)(Y-0.7145*(V - 128)-0.3456*(U - 128));
rgbout[idx++]=clip(temp);
temp=(int)(Y+ 1.4022*(V - 128));
rgbout[idx++]=clip(temp);
}
}
}
int writebmp(char *filename,unsigned char *rgbbuf,int width,int height){
BITMAPFILEHEADER bmpHeader;
BITMAPINFOHEADER bmpInfo;
int linebyte=width*3;//(width*3+3)/4*4;
int rgb_size=linebyte*height;
int count;
unsigned long k=0;
FILE *bmpfp;
memset(&bmpHeader,0,sizeof(BITMAPFILEHEADER));
memset(&bmpInfo,0,sizeof(BITMAPINFOHEADER));
bmpHeader.bfType=0x4D42;//"MB"
bmpHeader.bfSize=rgb_size+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmpHeader.bfReserved1=0;
bmpHeader.bfReserved2=0;
bmpHeader.bfOffBits=54;//sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFODEADER);
bmpInfo.biSize=sizeof(BITMAPINFOHEADER);
bmpInfo.biWidth=width;
bmpInfo.biHeight=height;
bmpInfo.biPlanes=1;
bmpInfo.biBitCount=24;
bmpInfo.biCompression=BI_RGB;
bmpInfo.biSizeImage=rgb_size;
bmpInfo.biXPelsPerMeter=0;
bmpInfo.biYPelsPerMeter=0;
bmpInfo.biClrUsed=0;
bmpInfo.biClrImportant=0;
bmpfp=fopen(filename,"wb");
if(bmpfp==NULL){
printf("Failed to open file %s\n",filename);
return -1;
}
count=fwrite(&bmpHeader,sizeof(BITMAPFILEHEADER),1,bmpfp);
if(count!=1){
printf("Failed to write bmpheader to file the count is %d\n",count);
return -1;
}
count=fwrite(&bmpInfo,sizeof(BITMAPINFOHEADER),1,bmpfp);
if(count!=1){
printf("Failed to write bmpinfo to file the count is %d %d\n",count,sizeof(BITMAPINFOHEADER));
fclose(bmpfp);
return -1;
}
count=fwrite(rgbbuf,1,rgb_size,bmpfp);
if(count!=rgb_size){
printf("Failed to write rgbbuf to file the count is %d\n",count);
fclose(bmpfp);
return -1;
}
fclose(bmpfp);
return 1;
}
int main(){
int i;
FILE *file_in;
int yuvsize=Width*Height*3/2;
int count;
unsigned char *yuvbuf;
unsigned char *rgbbuf;
char bmpfilename[]="first.bmp";
file_in=fopen("D:\\work\\yuv2rgb\\foreman_cif.yuv","rb");
if(file_in==NULL){
printf("failed to open file\n");
return;
}
yuvbuf=(unsigned char*)malloc(yuvsize);
rgbbuf=(unsigned char*)malloc(Width*Height*3);
memset(yuvbuf,0,yuvsize);
memset(rgbbuf,0,Width*Height*3);
if(yuvbuf==NULL){
printf("failed to malloc the yuv buffer\n");
return;
}
if(rgbbuf==NULL){
printf("failed to malloc the rgb buffer\n");
return;
}
fseek(file_in,0, SEEK_CUR);//移动文件指针的位置
count=fread(yuvbuf,yuvsize,1,file_in);
if(count!=1){
printf("failed to read yuv data!\n");
return;
}
fclose(file_in);
for(i=0;i<1;i++){
printf("Frame number is %d\n",i);
yuv2rgb(rgbbuf,yuvbuf,Width,Height);
if(writebmp(bmpfilename,rgbbuf,Width,Height)==1)
printf("Success to generate a bmp file\n");
}
free(yuvbuf);
free(rgbbuf);
}
转自:http://yumingfu.blog.163.com/blog/static/17507717720126307641853/
yuv420(planer) to bgr24 to bmp相关推荐
- 增加录像时间戳水印、 camera框架介绍
最近项目上要在mtk6589机器上增加录像的水印功能,那个纠结呀-- 一大通 度娘.google啊-- 最终整个变通的方案:做好10几个bmp(8位深度黑底白字)贴图,把文件使用ue去除掉bmp文件 ...
- android录像增加时间记录(源码里修改)
需要做一个功能,录像和播放时都显示录时的时间,参考文章链接找不到了,不好意思,这里记录一下,防止下次找不到了.另一篇关于源码录像的流程请参考 http://www.verydemo.com/demo_ ...
- 录像的视频如何在画面中实时加上时间戳
方法一(L之前版本): 可以在下面这个地方同,即MDP输出这个画面,但是Encode之前,使用SW的方式来Overlay即可,至于具体如何实现Overlay的话,网上搜索一下,很多示例代码的.如下的参 ...
- Camera 之相关 YUV 知识点总结
前言 在调试cam sensor 的过程中,不可避免的会碰到yuv相关的功能点.调试效果可能需要dump yuv 图,自己做预览需要对yuv进行转换显示等. 这里主要是对yuv的基础概念 .分类标准. ...
- YUV420存储为BMP和JPG图片
网上大多数关于YUV420的资料都是关于YUV420P的,很少有YUV420SP的,因为YUV420SP的UV是交错存放的,处理起来相对麻烦点,但是YUV420SP也是一种常见格式,因此,在这里,我将 ...
- FFmpeg开发实战(五):bmp转换为jpeg格式图像
文章目录 1. bmp结构 2. bgr24转yuv420p 3. yuv420转jpeg 4. 下载 本文介绍了将bmp格式图像转换为jpeg格式图像的方法,附有详细的代码和图像示例. 1. bmp ...
- 视频图像数据处理八:将rgb视频图像转换为yuv420格式视频图像
文章目录 转换公式 需要注意 函数代码 测试用例 下载 本文介绍了将rgb视频图像转换为yuv420格式视频图像的方法,附有详细的代码和图像示例.文中rgb24和yuv420文件需要使用yuv/rgb ...
- RGB、YUV、NV21、BMP相互转换
概述 最近学习雷神的博客,深受启发.后面的代码或者借鉴原作的代码,或者修改自原作.一般的图片播放器无法显示rgb和yuv格式的图片,为了方便查看rgb和yuv图片,雷神修改了一个网上的YUV/RGB播 ...
- java rgb to yuv420_RGB to YUV420转换
说明:下面的代码用C\C++执行都可以,用C的时候请把#include 删除. RGB to YUV420 原代码: RGB2YUV.CPP文件 #include #include #include ...
最新文章
- 高并发的核心技术 - 幂等的实现方案
- 怎么快速把语音转成文字
- IPSEC造成网络Destination host unreachable
- HandlerThread原理与应用
- 天天象棋 残局闯关 第17关
- JAVA国际化输出日期格式
- redis存储数据类型_Redis与Memcahe的区别最全整理
- ASP.NET企业开发框架IsLine FrameWork系列之一--第一次的亲密接触
- 泸州市的电子计算机学校名称,泸州电子计算机机械学校2020年招生简介
- 中国大数据与智能计算产业联盟“开源软件工作委员会”成立会议在京召开
- flask之--钩子,异常,上下文,flask-script,模板,过滤器,csrf_token
- 非线性方程求解 matlab,MATLAB应用 求解非线性方程
- 在win7中chm打不开的方法
- 《仿人机器人原理与实战》一第2章
- 使用FFmpeg将amr格式文件转换为MP3格式,结果为空的解决办法
- python 时间模块判断上午还是下午_Python的时间模块小结(转自:不懂真人)
- arc64,x86等架构linux,windows系统openjdk下载
- Error: recoverUnfinalizedSegments failed for required journal
- 获取所有复选框选中状态的id
- C#读取和写入文件(干货分享)
热门文章
- vue+axios方法封装(restful,ajax)
- 最详细的PCL编译安装流程
- [转]QT QDateTime类、QTimer类
- 《机器学习实战》程序清单3-4 创建树的函数代码
- Oracle数据库的状态查询
- Java集合Map与其子类回顾
- 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)
- 解决Unable to locate theme engine in module_path: pixmap
- 12-22 挑战留给自己,积极面对
- 原型设计模式及深拷贝