我正在将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,但对我来说却做不到(很多问题,太多的名字和太多的愚蠢的解决方法)。我不需要这个应用程序是跨平台的,我只针对64位Windows。
答案 0 :(得分:0)
我通过将videoInput cap
更改为指针并将其分配给构造函数中的videoInput对象来解决了此问题。