我正在编写一个程序,使用OpenCV同时从两个摄像头捕获(我不是这样做的立体视觉)。使用标准的OpenCV函数cvCaptureFromCAM()
来获取两个相同摄像头的捕获以及cvQueryFrame()
在一个while循环中被调用两次(每次捕获一次),我最终得到两个摄像头中的垃圾图像当我在cvNamedWindow
中显示它们时。
或者,如果我在自己的POSIX线程中运行每个摄像头(因此相同的地址空间),我会在第二个线程中出现分段错误,我无法找出原因。
最后,我可以在自己的进程中运行每个摄像头(因此单独的地址空间),一切运行正常。我怀疑是在从不同的摄像机进行每个帧查询之前必须获取某种锁类资源。希望有人对如何在同一个进程和同一个线程中获取两个捕获有一些想法。谢谢!
答案 0 :(得分:0)
什么操作系统?
它非常依赖于摄像机及其驱动程序 - 特别是在使用Directshow的窗口上,如果它们需要一起工作,如果你需要以某种顺序或某种方式启动它们,那么它就是完全的机会。
如果您可以在单独的线程中自行运行摄像头并让他们通过某些中立系统(命名管道,tcp套接字,ramdisk文件)写入图像,您可能会发现更可靠
答案 1 :(得分:0)
对于使用COM库的每个线程,您必须调用::CoInitializeEx( NULL,COINIT_MULTITHREADED)
一次并在完成捕获工作时取消初始化。
要在同一个进程和同一个线程中获取两个捕获,您是否为cvQueryFrame()
使用的缓冲区分配了一个副本?我怀疑你的两个捕获器从cvQueryFrame()
共享相同的缓冲区,而这个缓冲区实际上是由OpenCV本身维护的!因此,请尝试为每次捕获制作副本,看看它是否有效。
希望它有所帮助!