MFT 自定义图像过滤器
Posted
技术标签:
【中文标题】MFT 自定义图像过滤器【英文标题】:MFT Custom image Filters 【发布时间】:2012-07-31 16:56:53 【问题描述】:我目前正在开发一个 Metro Style 应用程序,它使用 MFT(媒体基础转换)将网络摄像头的视频流过滤成灰度,如 this 示例所示。
但是,现在我想应用其他类型的滤镜,例如曝光、色调、亮度、纹理、vignette 等。This 回答说我应该修改 TransformChroma 方法来实现这一点。不幸的是,我不知道如何获取 Y 值,我只能获取 U 和 V。如何获取 NV12、YUY2 和 UYVY 格式的 Y 值? p>
非常感谢所有帮助,我总是接受答案!
【问题讨论】:
【参考方案1】:您需要更改方法的签名(一个 poto 采用另一个参数并修改 TransformImage_UYVY、TransformImage_YUY2 和 TransformImage_NV12 方法以将该参数传递给更新的方法。您需要弄清楚如何自己提取该值不过。例如查看下面的这段代码,您可以看到如何提取 U 和 V 值,并且 Y 值被分成两个字节 - 您需要做一些位逻辑来连接这些。您可以找到描述这些格式在线,例如here。
// 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);
【讨论】:
这行得通,还是倒退?BYTE py = LO_NIBBLE(*pu) + (LO_NIBBLE(*pv) << 4); *pu = (HI_NIBBLE(*pu) << 4); *pv = (HI_NIBBLE(*pv) << 4);
我不确定,但我认为您正在尝试从 U 和 V 值中提取 Y 值,但它不是其中的一部分。它更像是 WORD y = (pSrc_Pixel[x] & 0xFF00) | (pSrc_Pixel[x+1] >> 8); // 或者交换 x 和 x+1。
但是我如何更新图像以反映编辑后 y 变量的变化?
将TransformChroma(mat, &u, &v)改为TransformChroma(mat, &y, &u, &v),然后修改TransformChroma来修改像素。现在,UV 被转换为向量并对其应用了矩阵变换。您可以使用更大的矩阵或单独更新 YUV 值。
有没有办法获得每个像素的 RGB 值,而不必为每个像素转换为/从 YUV 转换?以上是关于MFT 自定义图像过滤器的主要内容,如果未能解决你的问题,请参考以下文章