2014-11-14 811 views
-2

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

回答

0

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

一个线程与摄像机“通信”,即抓取图像,并将一个副本发送到线程写入文件,并将一个副本发送到GUI以显示实时图像。此外,只要相机不支持多播(假设它是一台ip-camera),帧速率很可能会下降。

+0

我正在使用USB网络摄像机。我不明白为什么它不可能。如果我将Detector注释掉并让MainWindow显示来自网络摄像头的视频源,我可以运行该程序的10个实例,并且它们都将显示来自同一个摄像头的相同视频,而不会有任何问题。如果显然可以多次访问网络摄像机,为什么不能在同一个程序中使用同一个网络摄像头两次? – testus 2014-11-14 16:22:16

+0

取决于OpenCV如何照顾相机手柄。我知道其他库在内部存储句柄列表并仅保留每个句柄的“实例”,因此当从不同线程访问时会导致问题/访问冲突等。但我认为你应该考虑我的建议,只使用一个摄像头连接并分发所拍摄图像的副本...... – Robert 2014-11-14 16:26:23

1

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