首页 > 其他分享 >YUV文件-y,u,v分量验证

YUV文件-y,u,v分量验证

时间:2023-08-02 19:11:15浏览次数:40  
标签:验证 YUV num yuv 128 255 buf 分量

通过程序采集yuv数据,并落1帧数据到文件中;

一、 此处记录下思路变化:

  • 1、 第一步是了解YUV格式,为什么会比RGB节省空间;
  • 2、 二则是按照YUV数据格式读取: 因为没有任何消息头尾的封装,所以只需要看YUV是什么格式,再按照字节读取分量即可;
  • 3、 验证总结:
    1. 验证时,最好以图片进行验证,视频可能会出现未知问题

    2. 最开始以为黑白图片是只存储YUV的y分量,malloc 开辟的空间也为分辨率的大小,(注意不是总图片的大小),校验时通过ffmpeg无法成功打开;

    3. 报错: > packet size 204800 < expected frame_size 614400

    4. 后来想到:
      生成图片或者视频时, 每一个像素都是有三分量构成,即使YUV422, YUV420等,也不是说无UV分量,而是共享,所以怎么可能存储图片的时候,把UV分量丢弃;
      所以存储黑白照的时候,只需要将原始数据流的uv分量改为128即可;

二、 验证过程

此处只用一帧来进行测试说明

命令

  1. ffplay -f rawvideo -video_size 640*480 -pixel_format yuyv422 -i light.yuv
  2. vim -b light.yuv 以二进制打开yuv文件
    在vim下,
    :%!xxd 以16进制阅读yuv文件, 用于修改 yuv像素字节内容
    :%!xxd -r , 恢复16进制到2进制文件, 用于让ffmpeg能够继续展示YUV文件

三、 yuv原始数据和图片

YUV_0_255_255
YUV_0_255_255

四、 vim修改数据和图片

YUV_255_255_255
YUV_255_255_255

vim修改完后,一定要恢复到2进制文件,否则无法使用ffmpeg打开

五、代码

点击查看代码
void imageDealYUV422(const struct SBufInfo *const localBuf)
{
	//YUVYUV ; 2-48b-6B; (char *)
	//YUYV ; 2-32b-4B; 
	int y_chunck_size = localBuf->length; // TODO: 当size 为 length 的 n分之一 时,以640*480打开yuv视频,会竖向出现相同视频n副

	unsigned char *y_buf = (unsigned char *)malloc(y_chunck_size * sizeof(unsigned char *));
	memset(y_buf, 0, y_chunck_size);
	unsigned char *buf_ptr = y_buf;

	int u_flag=0;
	int v_flag=0;
	for (int yIndex = 0; yIndex < localBuf->length;)
	{
        //获取原始数据亮度值
		*buf_ptr = *((unsigned char *)(localBuf->start) + yIndex);
		
        //用于修改u,v分量
		if (yIndex % 2 != 0)
		{
			if(u_flag == 0){

				*buf_ptr = 128;
				v_flag = 0;
				u_flag = 1;
			}
			else if (v_flag == 0)
			{

				*buf_ptr = 255;
				v_flag = 1;
				u_flag = 0;
			}
		}

		yIndex += 1; // TODO: 当1为n时,以640*480打开yuv视频,会横向出现相同视频n副
		buf_ptr += 1;
	}

	fwrite(y_buf, sizeof(unsigned char), y_chunck_size, lFile);
	fflush(lFile);
	free(y_buf);
    y_buf=NULL;
}

六、.YUV文件颜色-测试分布

Y U V 颜色 图像
num 0 0 浅绿色
0 128 128 黑色(无亮度)
0 0 0 深绿色
0 num num 绿色
0 128 0 深绿色
0 0 128 更深绿色
0 255 255 紫色
255 128 128 白色(最亮)
255 0 0 亮绿色
255 0 128 亮黄色
255 128 0 亮蓝色
255 255 255 亮紫色
num 128 128 黑白色
num 0 num 浅黄绿色
num 128 num 黑白色
num num 0 深黄绿色
num num 128 黑白色


目前还有一个问题未解决:
yuv视频流数据保存时,当存储到文件的缓冲区申请空间为总像素字节大小的n分之一时,ffmpeg读取的图像会上下分成n份;
如下:

标签:验证,YUV,num,yuv,128,255,buf,分量
From: https://www.cnblogs.com/uagvdu/p/17601488.html

相关文章

  • 华中科技大学成功验证LK-99,美国实验室证实常温常压超导理论可行!
    原创|文BFT机器人上周,全球物理学界迎来了一则令人震惊的消息:一支韩国科学家团队宣布他们发现了全球首个室温超导材料。这种材料被称为“改性铅磷灰石晶体结构(下称LK-99,一种掺杂铜的铅磷灰石)”。这项研究引起了全球范围内的轰动,目前已有多个机构和实验室,包括北航、美国伯克利国家......
  • WPF使用FluentValidation进行表单验证
    WPF使用FluentValidation进行表单验证.net版本:6.0使用的NuGet包FluentValidation:11.6.0MaterialDesignThemes:4.9.0Prism.DryIoc:8.1.97在WPF里验证表单使用的是INotifyDataErrorInfo接口,这个接口长这样publicinterfaceINotifyDataErrorInfo{boolHasErrors{get;......
  • 【Python小随笔】Pillow简单示例(图片添字,图片覆盖图片,复杂验证码...)
     简单创建添加文字到图片fromPILimportImage,ImageDraw,ImageFont,ImageFilter#导入PIL库中的相关模块importrandom#导入random库#简单的添加文字"""mode:图片模式,指定了每个像素点的颜色组织方式。常用的模式有:'1':二值图像,每个像素点只有黑和白两种颜......
  • .net 7 验证码功能
    usingSixLabors.ImageSharp还需要用到2个的插件,SixLabors.Fonts和SixLabors.ImageSharp.Drawing通过CLI手动安装dotnetaddpackageSixLabors.ImageSharp.Drawing--version1.0.0-beta15dotnetaddpackageSixLabors.Fonts--version1.0.0-beta19usingSystem.Text;......
  • 直播带货源码,什么是cross field validation(交叉验证)
    直播带货源码,什么是crossfieldvalidation(交叉验证)解释crossfield可以理解为跨字段,跨字段就是这个字段的校验依赖于另外一个字段(我的理解),比如 publicclassMyBean{ privatebooleanselected; privateStringsomeString; ...}​ 以上就是直播带货源码,什么是cr......
  • jQuery验证控件jquery.validate.js使用说明
    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validationjQueryplugin:Validation使用说明一导入js库<scriptsrc="../js/jquery.js"type="text/javascript"></script><scriptsrc="../js/jquery.validate.js"type=&q......
  • UVM:2.1_验证平台的组成
    1.首先看下面的结构吧:这个结构虽然不是一个严格满足官方规范的架构,但它真的可以跑.1).driver:产生最原始的data,发送给两部分。一个是DUT,另一个是referencemodel。2) referencemodel:是一个和DUT逻辑上相同的模块,可以sv,也可以通过DPI实现。我遇到的问题是,如果referencemodel和DU......
  • UVM:4.1.1 验证平台内部的通信
    1.两个components通信可以有如下方法:1)设置全局变量。2)设置public让外部访问。3)写一个新的class,uvm_object,用config_db(config_object)配置,被配置的components去吃这个新的class。但是都不好!!!!!!!!!!!!!!!!2.1)上面的方法如果加入阻塞和非阻塞的概念,会更复杂。2)scoreboard主动要求数据,又怎么实现......
  • SpringBoot SpringSecurity(四)短信验证码登录
    SpringSecurity默认只提供了账号密码的登录认证逻辑,所以要实现手机短信验证码登录认证功能,我们需要模仿SpringSecurity账号密码登录逻辑代码来实现一套自己的认证逻辑。通过下面步骤来完成短信验证码登录:1、短信验证码生成2、改造登录页3、添加短信验证码认证3.1定义SmsAu......
  • 验证码识别全流程实战
    本文将介绍验证码的历史与发展、验证码破解的历史与发展,验证码破解全流程实战。验证码的历史与发展验证码,全称为“CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart”,即全自动区分计算机和人类的图灵测试,Captcha。早在上个世纪90年代,为了防止恶......