#define RGB2YUV_SHIFT 16
#define BY ((int)( 0.098*(1<<RGB2YUV_SHIFT)+0.5))
#define BV ((int)(-0.071*(1<<RGB2YUV_SHIFT)+0.5))
#define BU ((int)( 0.439*(1<<RGB2YUV_SHIFT)+0.5))
#define GY ((int)( 0.504*(1<<RGB2YUV_SHIFT)+0.5))
#define GV ((int)(-0.368*(1<<RGB2YUV_SHIFT)+0.5))
#define GU ((int)(-0.291*(1<<RGB2YUV_SHIFT)+0.5))
#define RY ((int)( 0.257*(1<<RGB2YUV_SHIFT)+0.5))
#define RV ((int)( 0.439*(1<<RGB2YUV_SHIFT)+0.5))
#define RU ((int)(-0.148*(1<<RGB2YUV_SHIFT)+0.5))
void rgb24toyuv400(const unsigned char *src, unsigned char *ydst, unsigned char *udst,
unsigned char *vdst,unsigned int width, unsigned int height,unsigned int lumStride,
unsigned int chromStride, unsigned int srcStride)
{
unsigned int y;
for(y=0; y<height; y++)
{
unsigned int i;
for(i=0; i<height; i++)
{
unsigned int b= src[3*i+0];
unsigned int g= src[3*i+1];
unsigned int r= src[3*i+2];
unsigned int Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
ydst[i] = Y;
}
ydst += lumStride;
src += srcStride;
}
}
void rgb24toyuv411(const unsigned char *src, unsigned char *ydst, unsigned char *udst,
unsigned char *vdst,unsigned int width, unsigned int height,unsigned int lumStride,
unsigned int chromStride, unsigned int srcStride)
{
unsigned int y;
const unsigned int chromWidth = width>>1;
y=0;
for(; y<height; y+=2)
{
unsigned int i;
for(i=0; i<chromWidth; i++)
{
unsigned int b= src[6*i+0];
unsigned int g= src[6*i+1];
unsigned int r= src[6*i+2];
unsigned int Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
unsigned int V = ((RV*r + GV*g + BV*b)>>RGB2YUV_SHIFT) + 128;
unsigned int U = ((RU*r + GU*g + BU*b)>>RGB2YUV_SHIFT) + 128;
udst[i] = U;
vdst[i] = V;
ydst[2*i] = Y;
b= src[6*i+3];
g= src[6*i+4];
r= src[6*i+5];
Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
ydst[2*i+1] = Y;
}
ydst += lumStride;
src += srcStride;
for(i=0; i<chromWidth; i++)
{
unsigned int b= src[6*i+0];
unsigned int g= src[6*i+1];
unsigned int r= src[6*i+2];
unsigned int Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
ydst[2*i] = Y;
b= src[6*i+3];
g= src[6*i+4];
r= src[6*i+5];
Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
ydst[2*i+1] = Y;
}
udst += chromStride;
vdst += chromStride;
ydst += lumStride;
src += srcStride;
}
}
void rgb24toyuv420(const unsigned char *src, unsigned char *ydst, unsigned char *udst,
unsigned char *vdst,unsigned int width, unsigned int height,unsigned int lumStride,
unsigned int chromStride, unsigned int srcStride)
{
unsigned int y;
const unsigned int chromWidth = width>>1;
y=0;
for(; y<height; y+=2)
{
unsigned int i;
for(i=0; i<chromWidth; i++)
{
unsigned int b= src[6*i+0];
unsigned int g= src[6*i+1];
unsigned int r= src[6*i+2];
unsigned int Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
unsigned int U = ((RU*r + GU*g + BU*b)>>RGB2YUV_SHIFT) + 128;
udst[i] = U;
ydst[2*i] = Y;
b= src[6*i+3];
g= src[6*i+4];
r= src[6*i+5];
Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
ydst[2*i+1] = Y;
}
ydst += lumStride;
src += srcStride;
for(i=0; i<chromWidth; i++)
{
unsigned int b= src[6*i+0];
unsigned int g= src[6*i+1];
unsigned int r= src[6*i+2];
unsigned int Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
unsigned int V = ((RV*r + GV*g + BV*b)>>RGB2YUV_SHIFT) + 128;
vdst[i] = V;
ydst[2*i] = Y;
b= src[6*i+3];
g= src[6*i+4];
r= src[6*i+5];
Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
ydst[2*i+1] = Y;
}
udst += chromStride;
vdst += chromStride;
ydst += lumStride;
src += srcStride;
}
}
void rgb24toyuv422(const unsigned char *src, unsigned char *ydst, unsigned char *udst,
unsigned char *vdst,unsigned int width, unsigned int height,unsigned int lumStride,
unsigned int chromStride, unsigned int srcStride)
{
unsigned int y;
const unsigned int chromWidth = width>>1;
for(y=0; y<height; y++)
{
unsigned int i;
for(i=0; i<chromWidth; i++)
{
unsigned int b= src[6*i+0];
unsigned int g= src[6*i+1];
unsigned int r= src[6*i+2];
unsigned int Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
unsigned int V = ((RV*r + GV*g + BV*b)>>RGB2YUV_SHIFT) + 128;
unsigned int U = ((RU*r + GU*g + BU*b)>>RGB2YUV_SHIFT) + 128;
udst[i] = U;
vdst[i] = V;
ydst[2*i] = Y;
b= src[6*i+3];
g= src[6*i+4];
r= src[6*i+5];
Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
ydst[2*i+1] = Y;
}
udst += chromStride;
vdst += chromStride;
ydst += lumStride;
src += srcStride;
}
}
void rgb24toyuv444(const unsigned char *src, unsigned char *ydst, unsigned char *udst,
unsigned char *vdst,unsigned int width, unsigned int height,unsigned int lumStride,
unsigned int chromStride, unsigned int srcStride)
{
unsigned int y;
const unsigned int chromWidth = width;
for(y=0; y<height; y++)
{
unsigned int i;
for(i=0; i<chromWidth; i++)
{
unsigned int b= src[3*i+0];
unsigned int g= src[3*i+1];
unsigned int r= src[3*i+2];
unsigned int Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16;
unsigned int V = ((RV*r + GV*g + BV*b)>>RGB2YUV_SHIFT) + 128;
unsigned int U = ((RU*r + GU*g + BU*b)>>RGB2YUV_SHIFT) + 128;
udst[i] = U;
vdst[i] = V;
ydst[i] = Y;
}
udst += chromStride;
vdst += chromStride;
ydst += lumStride;
src += srcStride;
}
}
int HeadStand(unsigned char *pBuf,int pWidth,int pHeight)
{
unsigned char *tBuf;
int i;
if ((tBuf = (unsigned char *)malloc(pWidth*pHeight*3)) == NULL)
return -1;
for (i=0;i<pHeight/2;i++)
{
memcpy(tBuf,pBuf+i*pWidth*3,pWidth*3);
memcpy(pBuf+i*pWidth*3,pBuf+(pHeight-i-1)*pWidth*3,pWidth*3);
memcpy(pBuf+(pHeight-i-1)*pWidth*3,tBuf,pWidth*3);
}
free(tBuf);
return 0;
}
void CBmp2yuvDlg::OnConvert()
{
// TODO: Add your control notification handler code here
CString tPathName;
CString tDesDir;
char tDesPathName[100];
FILE *fp;
unsigned char *rgbBuf,*ty,*tu,*tv;
int with=0,height=0,iSizeImage = 0;
BITMAPFILEHEADER bitmap;
BITMAPINFOHEADER bitmapHeader;
char tStr1[100],tStr2[100];
int i,StrLen,SelYUVFormat;
CString FileName;
CComboBox *pComboBox;
int ySize,uSize,vSize;
//检测输入是不是合法
GetDlgItemText(IDC_SOURCEDIR,tPathName);
if(tPathName.IsEmpty() != 0)
return;
GetDlgItemText(IDC_DESDIR,tDesDir);
if(tDesDir.IsEmpty() != 0)
return;
GetDlgItemText(IDC_DESFILENAME,FileName);
if(FileName.IsEmpty() != 0)
return;
fp = fopen(tPathName,"r");
if(fp == NULL)
return;
//得到要转化的yuv格式
pComboBox = (CComboBox *)GetDlgItem(IDC_YUVFORMAT);
SelYUVFormat = pComboBox->GetCurSel();
//得到bitmap头部信息,包括文件头和bitmap头
memset(&(bitmap),0,sizeof(bitmap));
memset(&(bitmapHeader),0,sizeof(bitmapHeader));
fread(&bitmap,sizeof(char),sizeof(bitmap),fp);
fread(&bitmapHeader,sizeof(char),sizeof(bitmapHeader),fp);
//分配空间
with = bitmapHeader.biWidth;
height = bitmapHeader.biHeight;
if((with%2 != 0) || (height%2 != 0))
{
AfxMessageBox("图像的分辨率必须是偶数!",MB_OK,-1);
return;
}
// iSizeImage = bitmapHeader.biSizeImage;
iSizeImage = with*height*3;
switch(SelYUVFormat)
{
case YUV400:
rgbBuf = (unsigned char *)malloc(iSizeImage);
if(rgbBuf == NULL)
return;
ySize = iSizeImage/3;
ty = (unsigned char *)malloc(ySize);
if(ty == NULL)
return;
uSize = 0;
tu = (unsigned char *)malloc(uSize);
if(tu == NULL)
return;
vSize = 0;
tv = (unsigned char *)malloc(vSize);
if(tv == NULL)
return;
fseek(fp,bitmap.bfOffBits,SEEK_SET);
fread(rgbBuf,sizeof(char),iSizeImage,fp);
HeadStand(rgbBuf,with,height);
rgb24toyuv400(rgbBuf,ty,tu,tv,with,height,with,0,with*3);
break;
case YUV411:
rgbBuf = (unsigned char *)malloc(iSizeImage);
if(rgbBuf == NULL)
return;
ySize = iSizeImage/3;
ty = (unsigned char *)malloc(ySize);
if(ty == NULL)
return;
uSize = iSizeImage/12;
tu = (unsigned char *)malloc(uSize);
if(tu == NULL)
return;
vSize = iSizeImage/12;
tv = (unsigned char *)malloc(vSize);
if(tv == NULL)
return;
fseek(fp,bitmap.bfOffBits,SEEK_SET);
fread(rgbBuf,sizeof(char),iSizeImage,fp);
HeadStand(rgbBuf,with,height);
rgb24toyuv411(rgbBuf,ty,tu,tv,with,height,with,with/4,with*3);
break;
case YUV420:
rgbBuf = (unsigned char *)malloc(iSizeImage);
if(rgbBuf == NULL)
return;
ySize = iSizeImage/3;
ty = (unsigned char *)malloc(ySize);
if(ty == NULL)
return;
uSize = iSizeImage/12;
tu = (unsigned char *)malloc(uSize);
if(tu == NULL)
return;
vSize = iSizeImage/12;
tv = (unsigned char *)malloc(vSize);
if(tv == NULL)
return;
fseek(fp,bitmap.bfOffBits,SEEK_SET);
fread(rgbBuf,sizeof(char),iSizeImage,fp);
HeadStand(rgbBuf,with,height);
rgb24toyuv420(rgbBuf,ty,tu,tv,with,height,with,with/4,with*3);
break;
case YUV422:
rgbBuf = (unsigned char *)malloc(iSizeImage);
if(rgbBuf == NULL)
return;
ySize = iSizeImage/3;
ty = (unsigned char *)malloc(ySize);
if(ty == NULL)
return;
uSize = iSizeImage/6;
tu = (unsigned char *)malloc(uSize);
if(tu == NULL)
return;
vSize = iSizeImage/6;
tv = (unsigned char *)malloc(vSize);
if(tv == NULL)
return;
fseek(fp,bitmap.bfOffBits,SEEK_SET);
fread(rgbBuf,sizeof(char),iSizeImage,fp);
HeadStand(rgbBuf,with,height);
rgb24toyuv422(rgbBuf,ty,tu,tv,with,height,with,with/2,with*3);
break;
case YUV444:
rgbBuf = (unsigned char *)malloc(iSizeImage);
if(rgbBuf == NULL)
return;
ySize = iSizeImage/3;
ty = (unsigned char *)malloc(ySize);
if(ty == NULL)
return;
uSize = iSizeImage/3;
tu = (unsigned char *)malloc(uSize);
if(tu == NULL)
return;
vSize = iSizeImage/3;
tv = (unsigned char *)malloc(vSize);
if(tv == NULL)
return;
fseek(fp,bitmap.bfOffBits,SEEK_SET);
fread(rgbBuf,sizeof(char),iSizeImage,fp);
HeadStand(rgbBuf,with,height);
rgb24toyuv444(rgbBuf,ty,tu,tv,with,height,with,with,with*3);
break;
default:
break;
}
fclose(fp);
StrLen = tDesDir.GetLength();
for(i = 0; i < StrLen;i++)
tStr1[i] = tDesDir.GetAt(i);
tStr1[i] = 0;
StrLen = FileName.GetLength();
for(i = 0; i < StrLen;i++)
tStr2[i] = FileName.GetAt(i);
tStr2[i] = 0;
sprintf(tDesPathName,"%s\\%s.yuv",tStr1,tStr2);
fp = fopen(tDesPathName,"w");
if(fp == NULL)
return;
fwrite(ty,sizeof(char),ySize,fp);
fwrite(tu,sizeof(char),uSize,fp);
fwrite(tv,sizeof(char),vSize,fp);
fclose(fp);
free(rgbBuf);
free(ty);
free(tu);
free(tv);
AfxMessageBox("转化完成!",MB_OK,-1);
}相关推荐
【opencv】YUV各种色彩、YUV420sp2RGB
设实际宽高为w*h的图像,如果是RGB格式,那么他的数据量为w*h*3; 如果是yuv420格式,那么他的数据量为w*h*1.5 因为yuv4:4:4的数据量等于RGB数据量,而yuv4:4:4是yuv4:2:0数据量的2倍,所以yuv4:2:0的数据量为w*h*3/2。 从yuv420sp转化得到rgb的步骤: 1.当我们拿到一帧图像的yuv原始数据后,首先需要明确拿到的是以下哪种yuv数据:yuv4:4:4、yuv4:2:2、yuv4:2:0。并且,我们都会知道给对应图像的宽和高,因为这都是驱动配置给
RGB转YUV420代码示例
for(int i = 0; i < h; ++i) for (int j = 0; j < w; ++j) { Y = (unsigned char)((66 * (*r) + 129 * (*g) + 25 * (*b) + 128) >> 8) + 16; if (Y > 255) { Y = 255; }
【数据压缩】RGB2YUV/YUV2RGB实验报告
YUV与RGB空间的相互转换: (经过动态幅度调整后) Y=0.2990*R+0.5870*G+0.1140*B U=-0.1684*R+-0.3316*G+0.5*B V=0.5*R-0.4187*G-0.0813*BYUV与RGB空间的相互转换: R = Y+(R-Y) = Y+1.14075(V-128) G = Y+(G-Y)
彩色空间转换实验:RGB2YUV
实验原理 一、YUV与RGB空间的转换 在电视原理中我们学到过YUV与RGB的转换公式如下: Y=0.2990R+0.5870G+0.1140B V=0.7010R-0.5870G-0.1140B U=-0.2990R-0.5870G+0.8860B 除此之外,还需要对两个色差信号进行归一化,使得压缩后的色差信号动态范围控制在0.5以内,所以最终的转换公式为: Y=0.2990R+0.5870G+...
YUV4:2:2转换成RGB的代码
int convert_yuv_to_rgb_pixel(int y, int u, int v) { uint pixel32 = 0; uchar *pixel = (uchar *)&pixel32; int r, g, b; r = y + (1.370705 * (v-128)); g = y - (0.698001 * (v-128)) - (0.337633 * (u-12
基于FPGA的RGB2YUV、图像增强、YUV2RGBIP仿真实例
基于FPGA的RGB2YUV、图像增强、YUV2RGBIP仿真实例 AT7_Xilinx开发板(USB3.0+LVDS)资料共享 腾讯链接:https://share.weiyun.com/5GQyKKc 百度网盘链接:https://pan.baidu.com/s/1M7PLzRs-yMJv7NFJE8GVAw 提取码:qr0t 1图像增强IP简介 Xilinx的Vivado中集成的图像增强(...
彩色空间转化——RGB与YUV的转换
一、原理分析 由现代电视原理知识可知亮度和色差计算公式为: Y=0.2990R+0.5870G+0.1140B R-Y=0.7010R-0.5870G-0.1140B B-Y=-0.2990R-0.5870G+0.8860B 为使色差信号的动态范围控制在-0.5~+0.5之间,要对色差信号进行归一化处理,引入压缩系数后可以得到U、V的计算公式: U=-0.1684R-0.3316G+0.5B V=0.5R-0.4187G-0.0813B 此时得到的U、V范围在-128~127之间,为了避免出现负数,
YUV4:2:0格式与RGB格式的图片转化
文章目录实验目的算法基本原理 实验目的 一、课上老师已给出RGB转YUV格式的示例程序,阅读并理解该程序。 二、编写将YUV转换为RGB的程序。将给定的实验数据用该程序转换为RGB文件。并与原RGB文件进行比较,如果有误差,分析误差来自何处。 算法基本原理 该实验中,我使用的图像值域是[0,255]。值域为[0,255]常用的转换公式如下。 RGB转YUV的公式: Y = 0.2990R + 0.5870G + 0.1140B U = - 0.1684R - 0.3316G + 0.5B + 128 V =
YUV2RGB 库使用教程
YUV2RGB 库使用教程 1. 项目介绍 YUV2RGB 是一个用 C99 编写的轻量级库,专注于快速地在 YUV420p 和 RGB24 图像格式间进行转换。该库由 descampsa 开发,旨在提供高效且易于集成到其他项目的解决方案,适用于实时视频处理或图像处理场景。 2. 项目快速启动 安装依赖 确保你的开发环境已安装必要的编译工具,例如 GCC 或 Clang。 sudo apt-get...
YUV2与RGB图像变换
实验目标 使用c以及c++语言编写色彩空间的转换,利用YUV文件转换为RGB文件并比较不同。 实验原理 1.YUV与RGB空间的相互转换 由电视原理可知,亮度和色差信号的构成如下: Y=0.2990R+0.5870G+0.1140B R-Y=0.7010R-0.5870G-0.1140B B-Y=0.2990R+0.5870G+0.8860B 为了使色差信号的动态范围控制在0.5之间,需要进行归一化,对色差信号引入压缩系数。归一化后的色差信号为: U=0.1684R+0.3316G+0.5B V=0.5R-
基于AVX2的YUV420转RGB C++代码
第一次写博文,不好意思,写的应该不好,另外我只是C++的业余程序员,C++功底很一般,见谅! 我在做视频识别的工程中要用到YUV转RGB的功能,以前我用过MMX指令的代码,那是网上找的代码,我当时并不懂MMX,也不懂汇编,只是知道MMX比普通代码要快,确实很快,现在知道SSE2比MMX要快一倍,AVX2比SSE2要快一倍,所以想尝试用AVX2来实现YUV转RGB的功能,在网上寻找多次,也
RGB、YUY2、YUYV、YVYU、UYVY、AYUV、YUV444、YUV422、YUV420、YUV411
1) YUV 4:4:4 YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特),经过8比特量化之后,未经压缩的每个像素占用3个字节。 下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 (2) ...
android yuv2rgb
利用opengl es2 写好的yuv2rgb 的源代码。希望帮助那些优化视频的朋友们
yuv2rgb 项目推荐
yuv2rgb 项目推荐 项目基础介绍和主要编程语言 yuv2rgb 是一个开源项目,专注于提供高效的图像转换功能,主要用于将 YUV420p 格式的图像转换为 RGB24 格式。该项目采用 C99 作为主要的编程语言,确保了代码的高效性和跨平台兼容性。 项目核心功能 yuv2rgb 的核心功能是实现 YUV420p 到 RGB24 的快速图像转换。项目中不仅提供了标准 C 语言实现的优化函数,还...
数学文化赏析MOOC笔记【2023】
深圳大学UOOC课程《数学文化赏析》课程笔记
一文讲透什么是ADC/DAC中的DDC、DUC、采样率以及数据率等概念
摘要:ADC/DAC中的采样率与数据率概念不同,采样率是转换器的时钟速率,而数据率是数字输出的实际速率。抽取通过滤波降低数据速率,提升信噪比但牺牲带宽;内插则通过插零和滤波提高采样率,将镜像信号移远但增加延迟和功耗。JESD204B标准的高速转换器需平衡通道数与串行速率,内插/抽取技术是关键。文章还解析了DDC、DUC的应用及优缺点,为高速数据转换设计提供参考。(150字)
推荐:yuv2rgb - 高效的YUV转RGB库
推荐:yuv2rgb - 高效的YUV转RGB库 如果你在处理视频流或图像时需要进行YUV到RGB的颜色空间转换,那么将是一个很好的选择。 yuv2rgb是什么? yuv2rgb是一个高效的C++库,用于将YUV色彩空间转换为RGB色彩空间。它可以支持多种YUV格式和像素布局,并且提供了多线程加速功能,可以大大提高转换效率。 yuv2rgb能用来做什么? yuv2rgb可以用于各种需要进行颜色空间...
vins-mono前端详解(2)——imu预积分
本篇文章详细讲解了vins-mono中imu预积分内容,包括复杂的公式推导。
python中rgb转yuv,Python cv2.COLOR_RGB2YUV属性代码示例
# 需要导入模块: import cv2 [as 别名]# 或者: from cv2 import COLOR_RGB2YUV [as 别名]def test_every_colorspace(self):def _image_to_channel(image, cspace):if cspace == iaa.CSPACE_YCrCb:image_cvt = cv2.cvtColor(image...
(论文速读)PTV3: 更简单、更快速、更强大的3D点云处理新突破
该论文提出PointTransformerV3(PTv3),通过简化设计实现3D点云处理的效率突破。该研究摒弃复杂注意力机制,转而采用点云序列化和补丁注意力等高效方法,将感受野从16点扩展到1024点,在保持高精度的同时实现3倍速度提升和10倍内存优化。PTv3在超过20个室内外场景任务中取得SOTA结果,ScanNet语义分割达79.4%mIoU,Waymo检测提升3.3%APH。核心创新包括四种空间填充曲线序列化模式和xCPE位置编码,为3D感知的工业应用提供了高效解决方案。
简化神经元模型6 -- Hindmarsh-Rose Model
简化神经元模型 6 Hindmarsh-Rose Model
6614



被折叠的 条评论
为什么被折叠?



