使用 OpenCV 的多个摄像头

Posted

技术标签:

【中文标题】使用 OpenCV 的多个摄像头【英文标题】:Multiple cameras with OpenCV 【发布时间】:2011-09-15 21:08:46 【问题描述】:

我正在编写一个程序,该程序使用 OpenCV 一次从两个摄像头获取图像(我不是为了立体视觉而这样做)。使用标准 OpenCV 函数 cvCaptureFromCAM() 从两个相同的相机获取捕获,以及 cvQueryFrame() 在 while 循环中被调用两次(每次捕获一次),我最终在两个相机中都得到了垃圾图像,正如我显示它们时所看到的那样在cvNamedWindow

或者,如果我在它们自己的 POSIX 线程(因此相同的地址空间)中运行每个摄像头,我会在第二个线程中遇到分段错误,我无法找出原因。

最后,我可以在自己的进程中运行每台摄像机(因此是单独的地址空间)并且一切运行良好。我的怀疑是,在从不同的相机进行每个帧查询之前,必须获取某种锁定类型的资源。希望有人对如何在同一进程和同一线程中获取两个捕获有一些想法。谢谢!

【问题讨论】:

你能贴出你试过的代码吗? 【参考方案1】:

什么操作系统?

这非常依赖于摄像头及其驱动程序 - 特别是在使用 Directshow 的 Windows 上,如果它们能够一起工作,如果您需要以特定顺序或特定方式启动它们,则完全有可能。

如果您可以在单独的线程中自行运行摄像头,并让它们将图像写入某个中性系统(命名管道、tcp 套接字、ramdisk 中的文件),您可能会发现这样更可靠

【讨论】:

【参考方案2】:

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

为了在同一个进程和同一个线程中获得两个捕获,您是否为cvQueryFrame() 使用的缓冲区分配了一个副本?我怀疑你的两个捕获共享来自cvQueryFrame() 的同一个缓冲区,这个缓冲区实际上是由 OpenCV 本身维护的!所以尝试为每个捕获制作一个副本,看看它是否有效。

希望对你有帮助!

【讨论】:

以上是关于使用 OpenCV 的多个摄像头的主要内容,如果未能解决你的问题,请参考以下文章

在覆盆子上使用带有多个网络摄像头的 opencv 来拍摄延时摄影时出现多个 v4l 错误

Java + OpenCv 根据PID/VID调用指定摄像头

Java + OpenCv 根据PID/VID调用指定摄像头

机器视觉行业实践技巧

opencv怎样打开自己笔记本的摄像头

Linux opencv VideoCapture()函数打开多个USB摄像头