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



我正在使用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 静态库。

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

我之前已经尝试过OpenCV,但它对我不起作用(许多问题,太多无法命名和太多愚蠢的解决方法(。我不需要这个应用程序是跨平台的,我只针对 Windows 64 位。

我通过将videoInput cap更改为指针并在构造函数中为其分配 videoInput 对象来解决此问题。

最新更新