唤醒其他线程时视频输入设备断开连接

videoInput device disconnection on waking up other thread

我将 videoInput 库用于使用多个摄像头跟踪设备位置的应用程序。使用它,我可以完美地从输入图像中提取点,但是一旦我将代码移动到多线程,它就停止工作了。

每当主线程被视频捕获线程通过条件变量唤醒时,运行 视频捕获线程对象的成员对象似乎被解构,即使引用不是'在唤醒其他线程的过程中没有丢失。

主线程创建捕获线程并处理通过矢量传递的帧。这是在主线程中发生的初始化:

videoInput::setComMultiThreaded(true);
videoInput::listDevices(true);

在捕获线程中,对成员对象执行如下代码videoInput cap

cap.setupDevice(deviceId, width, height);
cap.setAutoReconnectOnFreeze(deviceId, true, 1);

然后循环执行下面的代码

unsigned char* frame = new unsigned char[width * height * 3]();
cap.isFrameNew(capId);
cap.getPixels(capId, frame, false, true);

它按预期工作,但一旦数据传递到主线程,主线程就会收到数据通知并用条件变量唤醒,设备断开连接(仅在videoInput 对象解构函数),导致循环的下一次迭代出现异常。我把最新的源码编译成了x64静态库。

我绝对需要应用程序是多线程的。是否缺少一些重要的东西来完成这项工作,或者我只是遇到了这个库的一些限制并且需要使用一些东西 else/make 我自己的 DirectShow 包装器?

我之前已经尝试过 OpenCV,但它无法满足我的需求(问题太多,无法一一列举,还有太多愚蠢的变通方法)。我不需要这个应用程序是跨平台的,我只针对 Windows 64 位。

我通过将 videoInput cap 更改为指针并将其分配给构造函数中的 videoInput 对象解决了这个问题。