我目前正在开发一个 Metro Style 应用程序,它使用 MFT(媒体基础转换)将网络摄像头的视频流过滤成灰度,如本示例所示。
但是,现在我想应用其他类型的滤镜,例如曝光、色调、亮度、纹理、晕影等。这个答案说我应该修改 TransformChroma 方法来实现这一点。不幸的是,我不知道如何获得 Y 值,我只能获得 U 和 V。如何获得 NV12、YUY2 和 UYVY 格式的 Y 值?
非常感谢所有帮助,我总是接受答案!
您需要更改方法的签名(一个 poto 采用另一个参数并修改 TransformImage_UYVY、TransformImage_YUY2 和 TransformImage_NV12 方法以将该参数传递给更新的方法。不过,您需要弄清楚如何为自己提取该值。例如,查看下面的这段代码,您可以看到如何提取 U 和 V 值,并且 Y 值被分成两个字节 - 您需要执行一些位逻辑来连接这些。您可以找到这些格式的描述在线,例如这里。
// Byte order is U0 Y0 V0 Y1
// Each WORD is a byte pair (U/V, Y)
// Windows is little-endian so the order appears reversed.
BYTE u = pSrc_Pixel[x] & 0x00FF;
BYTE v = pSrc_Pixel[x+1] & 0x00FF;
TransformChroma(mat, &u, &v);