YUV 8bit转10bit

在有些场景中,我们经常会使用到YUV 8 bit转10bit的场景。
比如YUV420p 8bit 转 P010,P010le,YUV420p10le。

首先说ffmpeg 8 bit 转 10bit.
对于ffmpeg的P010le 和P010be 分别代表小端和大端,那么它转化的时候非常简单,就是8 bit再增加 8bit,后面的8bit全为0.
比如:
在这里插入图片描述
这是最简单的一种办法,所以如果你有一个转换后的10bitYUV,那么只要简单的去掉这个全为0的byte就可以了。
补充说明:
P010le和P010be 排列方式和NV12一样,是YYYY… UVUVUVUVUVU…
下面是一个简单python代码,将10bit P010le转换为nv12:

import cv2 as cv
import numpy as np
import osW = 1920
H = 1080num=5
Y_planar = W*H*2
UV_planar = W*H# p010 2 nv12
root = os.path.split(os.path.realpath(__file__))[0]
name = root + "\\dev-0-session-0-test10-p010le.yuv"
fp = open(name, "rb")
fp2 = open(name+"-out-nv12.yuv","wb+")y1 = np.zeros(shape=(H, W), dtype=np.uint8, order='C')
u1 = np.zeros(shape=(int(H/2), int(W/2)), dtype=np.uint8, order='C')
v1 = np.zeros(shape=(int(H/2), int(W/2)), dtype=np.uint8, order='C')for i in range(num):for m in range(H):for n in range(W):msb = (ord(fp.read(1))>>2) lsb = (ord(fp.read(1))<<6)y1[m,n] = msb | lsbfor m in range(int(H/2)):for n in range(int(W/2)):msb = (ord(fp.read(1))>>2) lsb = (ord(fp.read(1))<<6)u1[m,n] = msb | lsbmsb = (ord(fp.read(1))>>2) lsb = (ord(fp.read(1))<<6)v1[m,n] = msb | lsbfp2.write(bytes(y1))fp2.write(bytes(u1))fp2.write(bytes(v1))fp.close()
fp2.close()

除了这种简单的增加一个字节的方式外,其实还有另外一种方式:
在这里插入图片描述

ffmpeg中的yuv420p10le就是这种方式。
燧远的y10,P010le就是这种方式。
下面一个脚本,可以将P010le的转为YUV420 8bit

import cv2 as cv
import numpy as np
import osW = 1920
H = 1080num=5
Y_planar = W*H*2
UV_planar = W*H# p010 2 nv12
root = os.path.split(os.path.realpath(__file__))[0]
name = root + "\\dev-0-session-0-test10-p010le.yuv"
fp = open(name, "rb")
fp2 = open(name+"-out-yuv420p8bit.yuv","wb+")y1 = np.zeros(shape=(H, W), dtype=np.uint8, order='C')
u1 = np.zeros(shape=(int(H/2), int(W/2)), dtype=np.uint8, order='C')
v1 = np.zeros(shape=(int(H/2), int(W/2)), dtype=np.uint8, order='C')for i in range(num):for m in range(H):for n in range(W):msb = (ord(fp.read(1))>>2) lsb = (ord(fp.read(1))<<6)y1[m,n] = msb | lsbfor m in range(int(H/2)):for n in range(int(W/2)):msb = (ord(fp.read(1))>>2) lsb = (ord(fp.read(1))<<6)u1[m,n] = msb | lsbmsb = (ord(fp.read(1))>>2) lsb = (ord(fp.read(1))<<6)v1[m,n] = msb | lsbfp2.write(bytes(y1))fp2.write(bytes(u1))fp2.write(bytes(v1))fp.close()
fp2.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9272.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇读懂React、vue框架的生命周期函数

当涉及到前端框架时&#xff0c;React 和 Vue.js 是两个非常受欢迎的选择。它们都提供了强大的工具和功能&#xff0c;帮助开发者构建交互式的、可扩展的应用程序。在这两个框架中&#xff0c;生命周期函数是一个重要的概念&#xff0c;它们允许我们在组件的不同阶段执行特定的…

https安全传输原理:

内容来自思学堂&#xff1a; 信息裸奔——>对称加密——>非对称加密——>非对称和对称加密——>权威第三方机构CA数字签名

Mockito的使用案例

流水线的单元测试 代码没有覆盖到&#xff0c;使用的是Mockito测试框架&#xff0c;原来是Mockito没有正确使用 package com.hmdp;import com.hmdp.controller.BlogController; import com.hmdp.entity.Blog; import com.hmdp.service.IBlogService; import com.hmdp.service.…

Spring学习(三)(类注解和方法注解)

目录 1. 存储Bean对象 1.1 配置扫描路径 1.2 添加注解存储Bean对象 1.2.1 Controller(控制器存储) 1.2.2 Service&#xff08;服务存储&#xff09; 1.3 这么多注解&#xff1f;&#xff1f;&#xff1f;为什么&#xff1f;&#xff1f; 1.3.1 类注解时间的关系 1.4 方法…

J2EE自定义mvc【框架配置及功能】

目录 一、配置步骤 二、配置框架前三步 导入相应的jar 导入相应的Class 导入xml文件 三、优化基本操作&#xff08;增删改&#xff09; 1、基础优化 编写实体类 编写BookDao类 优化BookDao JUnit测试 2、后台优化 3、前端优化 一、配置步骤 将框架打成jar包&…

【Hello mysql】 数据库库操作

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍数据库的库操作 库的操作 创建数据库创建数据库案例字符集和校验规则查看系统默认字符集和校验规则查看数据库支持的字符集和校验规则 校验规则对于数据库的影响操纵数据库查看数据库显示创建语句修改数据库数据库删除…

集成运放电路计算(全)

自记&#xff1a; 常用运放电路计算与分析 1、运放的符号表示 2、集成运算放大器的技术指标 (1) 开环差模电压放大倍数(开环增益)大 Ao(Ad)Vo/(V-V-)107-1012倍; (2) 共模抑制比高 KCMRR100db以上; (3) 输入电阻大 ri>1MW, 有的可达100MW以上; (4) 输出电阻小 ro 几W-几十…

Leetcode-每日一题【234.回文链表】

题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1]输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;head…

日历与时钟

目录 公历 黑色星期五 生物韵律 公历 在公历中&#xff0c;当年份为4的整数倍&#xff0c;但不是100的整数倍时&#xff0c;会出现闰年的现象。 y40 mod(y,4) 0 && mod(y,100)||mod(y,400)0 输出当时的年、月、日、时、分、秒 f%6d %6d %6d %6d %6d %9.3f\n cclock …

面向对象五大基本原则

面向对象五大基本原则 更多精彩 先案例后讲解&#xff0c;这里是代码教父&#xff0c;今天讲解面向对象的五大基本原则&#xff1a; 单一职责原则&#xff08;The Single Responsibility Principle&#xff09;开闭原则&#xff08;The Open-Closed Principle&#xff09;里氏…

深度学习-第T10周——数据增强

深度学习-第T10周——数据增强 深度学习-第T10周——数据增强一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目 四、数据预处理1、 加载数据1.1、设置图片格式1.2、划分训练集1.3、划分验证集1.4、查看标签1.5、再次检查数据1.6、配置数据集 2、数据可视化 五、数…

通过ioctl函数选择不同硬件的控制,LED 蜂鸣器 马达 风扇

通过ioctl函数选择不同硬件的控制&#xff0c;LED 蜂鸣器 马达 风扇 实验现象 head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{volatile unsigned int MODER; // 0x00volatile unsigned int OTYPER; // 0x04volatile unsigned int OSPEEDR; // 0x08volati…