阐明

一般来说,手机摄像头直接获取到的视频数据,都是 YUV 格局的,而要在屏幕上闪现毕竟需求转化为 RGB 的。而这一步的转化,可以用一个矩阵乘法来直接完结。那么为什么呢?

YCbCr 是在世界数字组织视频标准研制过程中作为ITU – R BT1601 主张的一部分逆向思想的例子, 其实是YUV经过缩放和偏移的翻版。矩阵游戏其间Y与YUV 中的Y意义一致, Cb , Cr 相同都指色彩, 只是在标明方法上不同算了。在YUV 家族中, YCb矩阵的迹Cr 是在计算机系统中应用最多的成员, 其应用领域很广泛,JPEG、MPEG均选用此格局。一般人们所讲的YUV大多是指YCbCr。

几许

YUV 与 RGB 的转化公式不止一种矩阵的初等变换规矩,首要原因是详细格局下,标准不同。本文目的是介绍这个转化的几许意义,所以咱们这儿选用苹果 Demo 中给出的转化矩阵,其它转化公式中,详细数值或许不同:

le矩阵的迹t ycbc逆向物流rToRGBT逆向ransform = float4逆向思想的例子x4(
simd_floa矩阵的迹t4(+1.0000, +1.0000, +1.0000, +0.0000),
sim矩阵天王d_float4(+0.0000, -0.3441, +1.7720, +0.0000),
simd_float4(+1.4020, -0.7141, +0.0000, +0.0000),
simd_floa逆向挑选t4(-0.7010, +0.逆向思想事例100个5291, -矩阵的迹0.8860, +1.0000)
);

将上面向量矩阵的初等变换规矩与矩阵乘法写成行列式方式,或许更契合大家的直觉:

R = Y + 1逆向思想.402*V - 0.701
G矩阵天王 = Y - 0.3441*U - 0.7141*V + 0.5291
B = Y + 1.772*U - 0.886

这儿咱们可以发现,这个 YUV 转 RGB 的公式其实是个线性转化,用几许的方逆向思想事例100个式表达就是说:

  • 将一个 RGB 的色彩用 xyz 坐标标明,那么将这个坐标(旋转、缩放、平移)之后,新的 xyz矩阵的乘法运算 坐标就可以标明 YUV 色彩值;
  • 反之也是,将一个 Y矩阵的初等变换规矩UV 色彩分量作为 xyz 坐标,那么将这个坐标逆向(旋转、缩放、平移)之后,新的 xyz 坐逆向思想练习500题标就可以标明 RGB 色彩值;

所以,咱们可以在 3D 空间中矩阵的逆画一个边长为 1 的正方体,后方左下角(0, 0, 0) 就代表黑色逆向行驶扣几分,前方右上角(1, 1, 1) 就代表白色,如下图右下角立方体。相同拷贝一个,并将其坐标用矩阵转逆向思想的例子化到 YUV 空间,如下图左上角倾斜的长方体。
S03E09: RGB 与YUV 转化矩阵的几许意义

对于 RGB 的立方体,比较简单:它的 x 坐标越大,越逆向行驶怎么处罚2021往右方,色彩越红;y 坐标越大,越往上方,色彩越绿;z 坐标越大,越往前方,色彩越蓝。

而 YUV 的长方体,它的 x 坐标越大,越往右方,亮度越大;y 坐标越大,越往上方,颜矩阵的逆色从黄到蓝;z 坐标越大,越往前方,色彩从青绿到红。

S03E09: RGB 与YUV 转化矩阵的几许意义

代码

let box1 = scene.rootNode.childNode(withName: "box", recursively: true)!
let box2 = scene.rootNode.childNode(withName: "box2", recursive矩阵游戏ly: true)!
simpleProgram(node: box1)
simpleProgram(node: box2)
//YUV 到 RGB
let ycbcrToRGBT矩阵的迹ransform = float4x4(
simd_float4(+逆向行驶1.0000, +1.0000, +1.0000, +0.0000),
simd_float4(+0.0000, -0.3441, +1.7720, +0.0000),
simd_float4(+1.4020, -0.7141, +0.0000, +0.0000),
simd_float4(-0.7010, +0.5291, -0.8860, +1.0000)
);
let p = ycbcrToRGBTransform.inverse//RGB 到 YUV
box1.simdTransform = p
//矩阵乘法        box2.simdTransform = box2.simdT矩阵的秩ransform * ycbcrToRGBTransform.inverse * box2.simdTransform.inverse
//用 sha逆向der 进行可视化逆向思想事例100个闪现
func simpleProgram(node:SCNNode) {
let program矩阵的秩 = SCNProgram()
program.verte矩阵的迹xFunctionName = "vertexShader"
progra逆向思想m.fragmentFunctionName = "fragmentShader"
// 赋值给**SCNGeometry矩阵天王**或许逆向**SCNMaterial**
guard let material = nod逆向思想事例100个e.geometry?.materials.first else { fatalError() }
material.program = program
}
//默许的头文件
#include <metal_stdlib>
using name矩阵的乘法运算space metal;
//与 SceneKit 合作使用时,需求的头文件
#include <SceneKit/scn_metal>
struct VertexInput {
float3 po逆向思想练习500题sition [[attribute(SCNVerte矩阵天王xSemantic矩阵的乘法运算Position)]];
};
struct ColorInOut
{
float4 position [[position]];
float4 color;
};
struct MyNodeData逆向行驶扣几分
{
float4x4 modelViewProject矩阵天王ionTransform;
};
// 极点着色器函数,输出为 ColorInOut 类型,输入为 VertexInput 类型的变量 in,和 MyNodeData 类型的变量指针 scn_node
vertex ColorInOut逆向思想的例子 vertexShader(VertexInput in [矩阵的乘法运算[stage_in]], constant MyNodeData& scn_node [[buffer(0)]])
{
Col逆向思想事例100个orInOut out;
// 将模型空间的极点补全为 float4逆向行驶 类型,进行 MVP 转化逆向挑选
out.矩阵的乘法运算position = scn_node.modelViewProject逆向挑选ionTransform * flo逆向行驶扣几分罚款多少钱at4(in.position, 1.0)逆向思想练习500题;
// 加 0.5,将坐标从[-0.5~0.5],转化到[0~1] 以代表色彩
out.color = float4(in.position + 0.5, 1);逆向思想
return out;
}
// 片元着逆向物流色器函数,输出为矩阵的乘法运算 half4,输矩阵入为矩阵天王 Color矩阵乘法InOut 类型的变量 in
fragment half4 fragmentShader(ColorI逆向行驶nOut in [[stage_in]])
{
return half4(in.color);
}