使用OpenCV实现多摄像头拍摄

3
我正在编写一个使用OpenCV获取两个摄像头捕获的程序(不是用于立体视觉)。使用标准的OpenCV函数cvCaptureFromCAM()从两个相同的摄像头中获取捕获,以及通过在while循环中调用cvQueryFrame()两次(每次捕获一次)来获取捕获。显示在cvNamedWindow中时,两个摄像头都会得到垃圾图像。
或者,如果我将每个摄像头在它们自己的POSIX线程中运行(因此具有相同的地址空间),第二个线程会导致段错误,而我无法找出原因。
最后,我可以使每个摄像头在其自己的进程中运行(因此具有单独的地址空间),一切都正常运行。我的猜测是,在从不同的摄像头查询每个帧之前,必须获取某种锁定类型的资源。希望有人能提供一些想法,以便在相同的进程和线程中同时获取两个捕获。谢谢!

1
你能发一下你尝试过的代码吗? - Andrey Kamaev
2个回答

0

对于每个使用COM库的线程,您必须调用::CoInitializeEx(NULL, COINIT_MULTITHREADED)一次,并在完成捕获工作时取消初始化。

为了在同一个进程和同一个线程中获取两个捕获,您是否为cvQueryFrame()使用的缓冲区分配了副本?我怀疑您的两个捕获共享来自cvQueryFrame()的相同缓冲区,而这个缓冲区实际上是由OpenCV自己维护的!因此,请尝试为每个捕获制作副本并查看是否有效。

希望能有所帮助!


0

是什么操作系统?

这非常依赖于相机和它们的驱动程序,特别是在使用Directshow的Windows上,它们是否能够一起工作完全取决于运气,如果您需要按特定顺序或以特定方式启动它们。

如果您可以在单独的线程中运行相机,并让它们将图像写入某个中立系统(命名管道、TCP套接字、RAM磁盘中的文件),您可能会发现这更可靠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接