手头有个项目需要实现通过采集卡采集手机桌面,获取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)。但是,很奇怪的发现:对缓冲模式,设置更高帧率没用,设置比默认帧率还高时(如60fps),相反还导致实际帧率下降了。回调模式设置帧率是有效的,不过要控制好回调函数不要阻塞过长,否则达不到设置帧率。

参考SampleGrabber回调源码:

回调参数mCB是class CSampleGrabberCB : public ISampleGrabberCB,需要重写几个虚函数。实际可以再另增加一个纯虚基类,并作为CCapture控制回调函数的一个参数的方式来使用。这样可以隐藏CSampleGrabberCB的实现,而是作为CCapture的一个friend class成员。用户使用时,通过重写这个虚基类的虚函数可实现回调。

[cpp] view plain copy
  1. //采集视频帧,回调模式</span>
[cpp] view plain copy
  1. hr = m_pGrabber->SetBufferSamples( FALSE );
  2. hr = m_pGrabber->SetOneShot( FALSE );
  3. hr = m_pGrabber->SetCallback( &mCB, 1 );
[cpp] view plain copy
  1. hr = m_pMC->Run();//开始视频捕捉

还可参考:

1 directshow抓取摄像头数据的封装类:http://blog.chinaunix.net/uid-8272118-id-2033249.html

2 CCapture directshow 视频捕获类:http://www.cnblogs.com/lidabo/p/3701654.html

3 USB摄像头采集图像(DirectShow):http://blog.csdn.net/jinxinliu1/article/details/7682009

4 关于CCaptureVideo类bug以及修改方法:http://blog.chinaunix.net/uid-8272118-id-2033245.html

DirectShow 修改CCaptureVideo类,使其支持多次打开:http://blog.csdn.net/aidy22/article/details/5008754

DirectShow摄像头采集相关推荐

  1. 基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新

            编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的.       基于现有资料 ...

  2. OpenCV 笔记(03)— 读取视频、通过摄像头采集视频、采集视频 canny 边缘检测

    我们本节学习如何利用 OpenCV 中的 VideoCapture 类,来对视频进行读取显示,以及调用摄像头. VideoCapture 它提供了从摄像机或视频文件捕获视频的 C++ 接口, 作用是从 ...

  3. opencv打开摄像头采集和保存

    纯粹是自娱自乐,并没有对opencv的使用进行深入的学习,用opencv打开视频文件或者打开摄像头采集,然后保存,这也是最基础的东西. 一.安装配置环境 VS2008下安装配置opencv,2005. ...

  4. Python3+Dlib+Opencv实现摄像头采集人脸并对表情进行实时分类判读

    Python3+Dlib+Opencv实现摄像头采集人脸并对表情进行实时分类判读 一. dlib以及opencv-python库安装 1.1 dlib库安装 1.2 opencv-python库安装 ...

  5. webrtc 渲染_WebRTC 开发(六)摄像头采集与视频渲染分析

    在上一篇文章 WebRTC 开发(五)编译与运行 Mac 工程 中,我们编译了 WebRTC 的工程 AppRTCMobile,也看到了 App 启动后的初始界面.本文基于 WebRTC M76 ,将 ...

  6. ffmpeg实现摄像头拉流_利用ffmpeg一步一步编程实现摄像头采集编码推流直播系统...

    了解过ffmpeg的人都知道,利用ffmpeg命令即可实现将电脑中摄像头的画面发布出去,例如发布为UDP,RTP,RTMP等,甚至可以发布为HLS,将m3u8文件和视频ts片段保存至Web服务器,普通 ...

  7. FFmpeg入门详解之122:Qt5 FFmpeg本地摄像头采集预览实战

    6.Qt5+FFmpeg本地摄像头采集预览实战 源码工程:S26_Test2 FFmpeg命令行处理摄像头 ffmpeg -list_devices true -f dshow -i dummy 命令 ...

  8. FFmpeg入门详解之124:Qt5 FFmpeg单路网络摄像头采集预览

    Qt5+FFmpeg单路网络摄像头采集预览 源码工程:S26_Test4 RTSP协议简介 RTSP(Real Time Streaming Protocol),RFC2326 RTSP(Real T ...

  9. 【Linux编程】UVC摄像头采集与显示(V4L2编程)

    手头有一个UVC(usb video class)摄像头(也称为免驱摄像头),就顺便学习了一下V4L2编程 ,写代码的过程中参考了前辈的博客,觉得写的非常的好,特将链接贴在这里 http://www. ...

最新文章

  1. [置顶]       webservice系列2---javabeanhandler
  2. 把PPT做漂亮点真的有用,研究证明图表美观增加可信度,作者:还会影响论文引用和通过率...
  3. ELK之收集日志到mysql数据库
  4. Ubuntu16.10安装Ocata之4:Neutron
  5. redis 备份导出rdb_redis简单安装学习
  6. Log4J入门教程(三) web项目的log4j配置
  7. 最大子段和问题Java实现
  8. HTML5知识点汇总
  9. mac下用xattr命令来删除文件的扩展属性
  10. iOS开发经验总结—内存管理
  11. python数组分成两个和相等的子集_前端面试2
  12. 首页大广告 redis缓存
  13. mysql加服务器命令_mysql服务器常用命令
  14. EMC Isilon(OneFS)数据恢复案例详解
  15. QQ群发消息怎么发?最全攻略分享
  16. 模拟人生5显示与服务器,模拟人生5之人生无限
  17. c++11 日期和时间工具(std::chrono::duration)(一)
  18. 清华大学计算机系成立量子软件研究中心,应明生受聘为主任
  19. SQL语句--简单的函数书写举例(3)
  20. InnoDB---深入理解事务提交--02

热门文章

  1. 适用于Mac的OmniFocus更新了macOS Big Sur的新小部件
  2. Java 毕业设计 OA办公系统
  3. cocos2d基础概念
  4. Tableau设置多边形地图、地理信息、背景地图源
  5. 铁路信号设备防雷,铁路行业防雷接地工程解决方案
  6. 如何制作电子证件照?十秒学会这个方法
  7. PT100温度阻值对照表
  8. Memos:一款开源的超高颜值备忘录,GitHub 星标 6.3k
  9. Windows Server 2019 新功能概述
  10. Android 游戏声音解决方案