您的位置:首页 > 其它

VC+DirectShow对视频进行图片处理之一

2007-07-17 12:49 225 查看
 下载本文源代码

  现在的图像越来越花巧了,有浮雕、马赛克、相框等特效,看得人眼花缭乱。本来图像特效没什么稀奇的,在PhotoShop等图像处理软件中我们早已见得多了,不过用在视频上就令人感觉有点神奇。我一直都想拥有这些效果,但我的摄像头是很早就买到的,没福气奢望驱动程序给它带来的全新精彩。刚好我学习DirectShow有一段时间了,既为了挑战自己(我从未写过令自己感到满意的程序),也为了检验学习成果,我就下了决心用DirectShow实现这些效果。几经努力,终于有了一些成绩,我完成了其中一些效果,并发现程序可以用在DirectShow支持的影音文件上,又自己把它应用到D3D中去,感觉还不错。

  先看看效果吧,以激励斗志。我是对着摄像头广告中的效果图来做程序的,我怕编程的热情像以前那样很快冷却,只留下一堆乱糟糟的代码,我需要它来不断兴奋被代码搞得昏头转向的大脑。





(图一:几种效果) (图二:D3D中的摄像展示)
  编程的思路是这样的:写一个DirectShow的VideoRenderer Filter用于实时获取图像,之后在用DirectShow连接并使用摄像头、播放视频时用上该Filter,这样就可以实时处理视频的图片并进行显示了。

  由于要用到DirectShow,我想在这里说一些关于DirectShow的初级知识,初学或没学过DirectShow的朋友就请耐下性子来听我这个初学者罗嗦一阵子(要学DirectShow的朋友可以看天极的DirectShow相关文章,介绍很详细)。

  在新版的DX9 SDK中已看不到DirectShow的影子了(DirectShow发展到了尽头?),不过DirectShow还可用,而且相当有用。听说VC.net自带有DX8 SDK开发文件,但我仍希望您能找到DX8 SDK和VC6。DX8 SDK帮助文件对DirectShow详细的说明和SDK丰富的DirectShow例子对DirectShow开发是大有裨益的。我在开发Filter过程中发现VC.net不能编译通过,出现“InterLockedExchange 重定义”的编译错误,VC6则一切正常,我把这归咎为微软的问题,菜鸟的我无力解决。是了,我只用VC6编写Filter,其它编码使用的是VC.net,VC.net可完成一般的DirectShow编程,我本人更喜欢VC.net的编码环境。

  “请问Filter是什么?”这个问题在我脑中很久了,DirectShow的功能是由Filter搭建起来的,但我很久以来都被“Filter”这个词困惑着,直到现在才有些眉目。当然,我学识浅,很可能会说错,请海涵。Filter在影音风暴等软件中称为“滤镜”,在微软中国上一些译文把它译为“筛选器”,五花八门的(看来没有核心技术真的很被动)。而Filter在数字信号处理等专业课程中称为“滤波器”!这下您应该知道一点了吧,DirectShow对视频、音频的处理过程就是数字信号处理的过程,可以把数字信号处理的理论应用于此,微软为此把这个DirectShow部件称为Filter。

  再说Sample,我把它译为“采样”,也就是一个数据包,可理解为摄像头摄像或声卡录音时每扫描一次得到的数据、音视频文件每一帧的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: