首页 > 其他分享 >YUV图像格式转换: YUYV 转 NV12

YUV图像格式转换: YUYV 转 NV12

时间:2023-08-16 09:44:07浏览次数:42  
标签:图像格式 int uv height width NV12 YUYV 分量

首先确认YUYV与NV12 的采样格式, YUYV 属于YUV4:2:2采样, 而NV12属于YUV4:2:0采样。 采样方式如下图所示:      实心圆表示Y分量, 空心圆表示一对U和V的分量。并且YUV图像中每一个Y分量,即表示一个像素点。   可以很明显地看出YUV422采样中两个像素点共用一对U和V的分量, 而YUV420采样中四个像素点共用一对U和V 的分量。有了这个概念,接下来的理解将十分轻松。   两者在存储方式上的表现如下图所示:      存储方式对比   在文件大小上,     YUYV: filesize = width * height + width * height / 2 + width * height / 2   NV12 : filesize = width * height + width * height / 4 + width * height / 4   即同条件的 NV12 文件大小是 YUYV 的 3/4。   那么你或许会烦躁了,怎么还不讲转化啊。别急,转换原理就是一两句话的事,上述都是铺垫。   转换原理: YUV4:2:2 —> YUV4:2:0 Y不变,将U和V信号值在行(垂直方向)在进行一次隔行抽样。具体到YUYV 和NV12 上,则是仅需要注意存储方式的差别。 uv 分量隔行抽样   废话不多说了,直接上代码,可以转换多帧YUV图像格式:   void yuyv_to_nv12(char * image_in, char* image_out, int width, int height, unsigned long int filesize)   {        /* 计算循环次数,YUYV 一个像素点占2个字节*/    int pixNUM = width * height;    unsigned int cycleNum = filesize /pixNUM/2;    printf("cycleNUM = %d\n",cycleNum);       /*单帧图像中 NV12格式的输出图像 Y分量 和 UV 分量的起始地址,并初始化*/   char *y = image_out;   char *uv = image_out + pixNUM ;     char *start = image_in;           unsigned int i =0;    int j =0,k =0;      /*处理Y分量*/   for(i= 0; i<cycleNum ;i++)   { int index =0; for(j =0; j< pixNUM*2; j=j+2) //YUYV单行中每两个字节一个Y分量 { *(y+index) = *(start + j); index ++; } start = image_in + pixNUM*2*i; y= y + pixNUM*3/2;   }              /**处理UV分量**/   start = image_in;   for(i= 0; i<cycleNum ;i++)   {     int uv_index = 0; for(j=0; j< height; j =j+2)  // 隔行, 我选择保留偶数行 { for(k = j*width*2+1; k< width*2*(j+1); k=k+4) //YUYV单行中每四个字节含有一对UV分量 { *(uv+ uv_index) = *(start + k); *(uv +uv_index+1) = *(start +k +2); uv_index += 2; } }     start = image_in + pixNUM*2*i;     uv =uv + pixNUM*3/2;   }  }  

标签:图像格式,int,uv,height,width,NV12,YUYV,分量
From: https://www.cnblogs.com/kn-zheng/p/17633099.html

相关文章

  • NV12图像格式叠加
    概述图像叠加与音频叠加(混音)不同,人耳可以同时听到两种声音,因此混音时需要将两种信号都保留;但视频不同,图像一旦叠加,那么叠加区域人眼就只能看到最上层的图像。本文仅阐述对原始图像数据做修改的叠加方式,不涉及多个plane实现显示级别的图像叠加的知识。因此本文所述的图像叠加基本......
  • Linux开发板调用摄像头(V4L2编程,含YUYV解码RGB)
    本文是基于Linux开发板的V4L2摄像头调用程序,包括YUYV解码为RGB,以及将摄像头数据显示在开发板屏幕上。代码未封装,可直接在linux下编译使用。 工作流程:打开设备—>检查和设置设备属性—>设置帧格式—>设置一种输入输出方法(缓冲区管理)—>循环获取数据—>数据解码—>显......
  • 4412 使用usb摄像头拍照YUYV格式
    一、内核设置Linux内核中已经带有很完善的USB摄像头驱动,支持几乎所有的USB摄像头,我们只需要配置内核,选择上相应的Sensor型号即可。配置内核,支持USB摄像头:DeviceDrivers---><*>Multimediasupport---><*>VideoForLinux[*]Ena......
  • NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888等图像色彩编码格式区别
    常用图像颜色编码格式NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888都是常见的图像颜色编码格式,它们之间的主要区别在于色彩空间和数据排列方式。NV21:NV21是Android系统使用的一种图像颜色编码格式,它采用的是YUV4:2:0的采样方式,意味着垂直方向上每两个像素采样一次,水平方向上每个像......
  • opencv nv12转jpg, 拿到jpg数据
    typedefstructtagRect{intCX;intCY;intWidth;intHeight;}RECT;typedefstructtagRect_ex{RECTrects[12];}RECT_EX;inttest_nv1......
  • FFmpeg开发-视频播放【软/硬解码 + OpenGL显示YUV/NV12】05 转载
    1、概述最近研究了一下FFmpeg开发,功能实在是太强大了,网上ffmpeg3、4的文章还是很多的,但是学习嘛,最新的还是不能放过,就选了一个最新的ffmpegn5.1.2版本,和3、4版本api变化......
  • OpenCV对NV12进行通道分离后缩放再保存为NV12格式
    1.OpenCV对NV12进行通道分离后缩放再保存为NV12格式 #include<stdio.h>#include<opencv2/opencv.hpp>/***@brief*把输入的NV12图像分离为YUV三个分量图......
  • 图像格式总结
    本文主要讲一下常见的3种图像格式,RAW,RGB,YUV目录​​1、RAW​​​​2、 RGB​​​​3、YUV​​​​3.1、yuv定义:​​​​3.2、采样格式:​​​​3.3、存储格式:​​  1......
  • Android系统、图像格式、Android Camera简介
    Android架构简析Android操作系统是基于linux内核的软件栈,由C/C++/JAVA等语言开发,其层次结构如下所示:软件层功能描述组件描述内核层进程管理,内存管理,文件管理等操作系统核心......
  • 一张图理清所有的RAW RGB YUV图像格式
    0.引言之前一直做着和camera有关的工作,所以常常会涉及到图像格式的问题。感觉接触的名字和种类很多,索性好好整理一下,分个类,也方便后面再整理。1.直接上结论直接......