【问题标题】:Grab Video Stream from FireWire从 FireWire 抓取视频流
【发布时间】:2011-10-22 12:16:24
【问题描述】:
我正在尝试通过 FireWire 将摄像机 (Sony HVR-Z1E) 中的视频流式传输到我的计算机。传入的图片/流应由一些需要 CVMat 格式(来自 openCV)的函数进一步处理。
好吧,我的问题是现在我不知道如何获取流。好的 openCV 2.1 为我提供了一些方法( cvCapturefromCam ),但无论我给他哪个参数,它总是从笔记本电脑的网络摄像头而不是从火线获取流。我听说我需要在 DirectShow API 中切换主凸轮(使用 Windows SDK)。但我实际上也不知道该怎么做。
那么有什么建议吗?
【问题讨论】:
标签:
c++
opencv
directshow
firewire
【解决方案1】:
查看我的相关答案here。 OpenCV 无法从 Firewire 摄像机本地捕获视频。您将需要使用 CMU1394 驱动程序或 Sony 驱动程序(如果有可用的 SDK)从该相机捕获视频,然后将其传递给 OpenCV。
【解决方案2】:
几年前,我使用 DirectShow 制作了类似的东西。主要限制是事实,通过 DShow 获取的图像是标准 PAL 分辨率。高清图像抓取是不可能的(它是索尼的第一款亲消费高清摄像机之一,现在不记得确切的型号了)。好消息是——这个方法除了 DirectShow 不需要任何东西——不需要额外的驱动程序等等。而且速度非常快。
一般来说,方法是这样的:
- 构建媒体渲染图(当然,你必须在那个阶段枚举视频设备)
- 将继承自 ISampleGrabberCB 的自定义类插入其中。
它是如何工作的:
- 它使用了来自 ISampleGrabberCB 的 BufferCB() 虚拟方法 - 您必须在继承的类中编写该方法。
- 在提到的方法中,您必须将数据留在全局结构中,并从主线程 - 照顾好它们。
我知道,这描述有点模糊,但我希望你能找到你的信息(谷歌搜索“ISampleGrabberCB”应该是一个很好的起点,应该有很多示例代码)。