DirectShow摄像头采集

手头有个项目需要实现通过采集卡采集手机桌面,获取ROI区域图像,进而进行视频自动化评测。opencv采集性能太低,不满足60fps的要求,查了资料,据说DirectShow可以达到100+frame 的采集速率。同时由于中间图像处理需要用到opencv,自然希望通过directShow+opencv直接采集为IplImage格式数据,是最完美的。

  终于在opencv官方论坛找到了yushiqi老师的CameraDS类。就需要两个文件(CameraDS.cpp和h)+ DirectShow SDK。当然不必下载庞大的DS SDK,网上有很多lib+inc的SDK。据说只能用DirectShow 9b和之前的SDK。到目前,一切都非常顺利,采集手机桌面数据预览和帧率都满足我的要求。当是,开始进行有源SSIM打分时,发现经常只有2.0甚至更低MOS分。初始,我怀疑可能是采集卡或者通话引擎或者我代码数据处理的问题。排查了一圈,且通过对比AMCap程序,发现AMcap采集是完好的。失望的发现,这种方式采集下来的原始图像就是有问题的。现象是:采集几十帧就会概率出现一帧错误图像,对运动区块某帧会出现横条纹。网上某个论坛里,我也看到有人询问同样的问题,但是没有得到解决答案,而且我1080p/720p都会出现。

  到此有些无助了,只有硬着头皮去研究一下DirectShow SDK采集和SampleGrabber了。也下载了AMCap源码,毕竟它没有出现我这种问题。了解到:DSSampleGrabber有两种采集模式--缓冲和回调。AMCap中保存文件使用的是另一个filter graph直接保存文件,而CameraDS中用的正是缓冲模式。到此,眼前一亮,要不要换作回调采集模式试试。又查了下资料,发现CCapturVideo类中用的就是回调模式。赶紧拿过来,测试了一下,没有出现遇到的问题。哈哈。问题解决了。

总结

初步怀疑CCameraDS封装的帧采集缓冲模式有bug,用回调模式可以解决。但是回调函数中好像不能做UI处理,会卡住,如ShowImage。最好回调中仅仅用来保存帧数据。CCaptureVideo和窗口显示耦合太高了,使用时,可以在CameraDS基础上合入CCaptrue中回调模式和功能。

但是缓冲模式为啥不行暂时还没有弄清楚原因,带后续研究后再补充。

补充:

缓冲模式捕获单帧过程:run->wait->getcur->getcur。对缓冲模式的断层问题,开始以为是接口流程不对导致取数据太快了,在wait后pause,默认帧率时有改善,高帧率还是会出现错帧。看来这样无法根本解决缓冲模式采集的问题。

设置帧率:

接口:setformat。从获取结果来看,不设置帧率时,获取到的默认帧率,应该是建议稳定运行的高帧率。我T220E,1080p /60fps采集卡,默认获取帧率是52帧(19ms)。但是,很奇怪的发现:对缓冲模式,设置更高帧率没用

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值