做这个filter,我是参考了别人的文章。其实是copy过来的,只是修改了一点。
原文:http://www.rosoo.net/a/201109/15051.html
当然里面的代码,也基本上是copy,在帮助文档那有。
这个filter关键的地方是处理RGB视频流。
代码:
- BYTE rColor,gColor,bColor,changeColor;
- for (int i=0;i<m_Height;i++)
- {
- for (int j=0;j<m_Width;j++)
- {
- rColor=*(pbInput+(m_Height-i-1)*m_bytePerLine+j*3);
- gColor=*(pbInput+(m_Height-i-1)*m_bytePerLine+j*3+1);
- bColor=*(pbInput+(m_Height-i-1)*m_bytePerLine+j*3+2);
- changeColor=(rColor+gColor+bColor)/3;
- *(pbOutput+(m_Height-i-1)*m_bytePerLine+j*3)=changeColor;
- *(pbOutput+(m_Height-i-1)*m_bytePerLine+j*3+1)=changeColor;
- *(pbOutput+(m_Height-i-1)*m_bytePerLine+j*3+2)=changeColor;
- }
- }
我觉得下面这段代码不是很好:
- changeColor=(rColor+gColor+bColor)/3;
所以我就是用RGB转YUV的公式
代码改为:
BYTE rColor,gColor,bColor,changeColor;
BYTE gray;
for (int i=0;i<m_Height;i++)
{
for (int j=0;j<m_Width;j++)
{
rColor=*(pbInput+(m_Height-i-1)*m_bytePerLine+j*3);
gColor=*(pbInput+(m_Height-i-1)*m_bytePerLine+j*3+1);
bColor=*(pbInput+(m_Height-i-1)*m_bytePerLine+j*3+2);
BYTE gray= 0.299*rColor + 0.587*gColor + 0.114*bColor;// RGB转YUV公式
*(pbOutput+(m_Height-i-1)*m_bytePerLine+j*3)=gray;
*(pbOutput+(m_Height-i-1)*m_bytePerLine+j*3+1)=gray;
*(pbOutput+(m_Height-i-1)*m_bytePerLine+j*3+2)=gray;
}
}
因为刚学习directshow,连如何用GraphEdit预览都不知道。摸索了下就找到方法了。
方法:
1、首先要注册这个filter,在运行里regsvr32.exe D:\ToGrayFilter.ax 我是把ToGrayFilter.ax 放在D的根目录下的。
点击确定就会弹出提示框显示成功的了。
2、打开GraphEdit,当然先看看自己电脑有没有这个工具。
3、在GraphEdit上点击Graph选择Insert Filters,就会弹出一个框框啦。
4、在弹出的框框上找到Video Capture Source,点击然后双击ASUS USB2.0 WebCam(因为的是华硕笔记本,自带摄像头。不同的设备所列出的项有所不同)
5、点击DirectShow Filters,分别双击AVI Decompressor、Color Space Converter、To Gray Filter(这个是第一步注册的filter)、Video Renderer
6、然后按顺序把它们连起来,ASUS USB2.0 WebCam-->AVI Decompressor-->To Gray Filter-->Color Space Converter-->Video Renderer
7、点击运行就可以了。