【问题标题】:cv::VideoCapture: accessing the same webcam from two threadscv::VideoCapture:从两个线程访问同一个网络摄像头
【发布时间】:2014-11-14 15:25:40
【问题描述】:

我有两个带有两个线程的类:一个在我的 GUI 中显示网络摄像头帧,一个从同一个网络摄像头录制视频。 我在每个班级都使用不同的cv::VideoCapture 来访问我的网络摄像头。我的 MainWindow 和 Recorder 类的两个构造函数都有 theWebcam.open(INDEX) 行来打开网络摄像头。我的问题是,当我的程序尝试打开第二个cv::VideoCapture 对象时,大约有 50% 的时间在启动时崩溃。如何在两个课程中使用相同的网络摄像头?

【问题讨论】:

    标签: c++ opencv video-capture


    【解决方案1】:

    我在罗伯特描述的技术上也取得了成功。我使用指针将图像传递给不同的线程,并让主线程创建我需要的所有 VideoCapture 对象以及 namedWindow 对象。我现在说的超出了我的专业领域,但我的经验表明,OpenCV 中的 VideoCapture 和 namedWindow 对象不能在主线程之外的任何线程中创建,而是必须传递到辅助线程中。

    【讨论】:

      【解决方案2】:

      据我所知,这是不可能的(但我自己从未尝试过)。我更喜欢以下方法:

      一个线程与相机“通信”,即抓取图像,并将一份副本发送到线程以写入文件,并将一份副本发送到 gui 以显示实时图像。

      此外,只要摄像机不支持多播(假设它是 ip 摄像机),帧速率很可能会下降。

      【讨论】:

      • 我正在使用 USB 网络摄像头。我不明白为什么不可能。如果我将 Detector 注释掉,只让 MainWindow 显示来自网络摄像头的视频,我可以运行 10 个程序实例,它们都将显示来自同一个网络摄像头的相同视频,没有任何问题。如果显然可以多次访问网络摄像头,为什么不能在同一个程序中访问同一个网络摄像头两次?
      • 取决于 OpenCV 如何处理相机手柄。我知道其他库在内部存储了一个句柄列表,并且每个库只保留一个“实例”,因此当从不同的线程访问时,它会导致问题/访问冲突/等。但我认为你应该考虑我的建议,只使用一个相机连接并分发所拍摄图像的副本......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多