Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ openCV和线程问题_C++_Multithreading_Opencv - Fatal编程技术网

C++ openCV和线程问题

C++ openCV和线程问题,c++,multithreading,opencv,C++,Multithreading,Opencv,我正在尝试将openCV中的facedetect应用到我的QT代码中,在我决定为我的openCV代码创建一个线程之前,所有这些都可以正常运行,这样我就可以在face detect打开时运行其他东西 问题是如果我调用class->start();我的程序在run()中中断while循环,但是如果我调用class.run();(像一个正常的函数)它照常运行!有什么不对劲 代码: 非常感谢 只有当cvQueryFrame()返回空帧,或者用户在键盘上按q时,循环才会中断 添加调试,以便您知道第一种情况

我正在尝试将openCV中的facedetect应用到我的QT代码中,在我决定为我的openCV代码创建一个线程之前,所有这些都可以正常运行,这样我就可以在face detect打开时运行其他东西

问题是如果我调用class->start();我的程序在run()中中断while循环,但是如果我调用class.run();(像一个正常的函数)它照常运行!有什么不对劲

代码:


非常感谢

只有当
cvQueryFrame()
返回空帧,或者用户在键盘上按
q
时,循环才会中断

添加调试,以便您知道第一种情况发生的时间:

frame = cvQueryFrame( capture );
if( !frame ) 
{  
  qDebug("cvQueryFrame failed!");
  break;
}
您确定
cvCaptureFromCAM(0)
有效吗?根据操作系统的不同,我必须为其传递
-1
。但事实是,您永远不会知道
cvCaptureFromCAM(0)
是否成功,因为您没有检查返回,这可能就是问题所在

capture = cvCaptureFromCAM(0);
if (!capture)
{
  qDebug("cvCaptureFromCAM failed!");
  //exit(0); or whatever
}
编辑:

请特别注意:您正在创建一个名为“video displaum”的窗口,但您正在尝试在另一个名为“video”的窗口上显示帧

无论如何,如果更改窗口创建函数以使用适当的枚举,也会更好:

cvNamedWindow("video DisplUM", CV_WINDOW_AUTOSIZE);
现在在
faceTracker::run()
comment
detectFaces()
上,添加对cvShowImage(“视频显示”,frame)的调用

在添加奇特的东西(如人脸检测)之前,请始终确保您的应用程序符合最低要求。我的最后一个建议是:编写足够的代码,只需从一个线程捕获图像并将其显示在窗口上,然后从那里开始。

解决方案:
我无法在主线程之外创建窗口,这就是它崩溃的原因。如果我对窗口创建进行了评论,所有操作都正常(包括人脸检测)

我遇到了类似的问题。我发现我必须重建OpenCV并包含TBB库。这为OpenCV添加了线程支持。一旦我这样做了,我就可以在我选择的任何线程中弹出窗口。我已经在C和C++实现中对2.1和2.2版本进行了测试。

类在哪里和什么是->开始()?如果您需要更多帮助,则需要共享更多代码。如果没有更多的信息,我们无法判断出哪里出了问题。您所说的“我的程序在while循环中中断”是什么意思?代码经过编辑以包含主程序。关于while循环,我的意思是qDebug(“teste3”);不显示,因此问题在frame=cvQueryFrame(捕获)中;我想这就是我刚刚添加的内容,没有关于调试的消息=/我发现有人有同样的问题,但也没有答案:您是否使用OpenCV运行了一个简单的应用程序?你能看到窗户上捕捉到的画面吗?你看到它工作了吗?出于测试目的,我会从执行
cvQueryFrame()
的同一个线程执行
cvCaptureFromCAM()
。是的,如果我不使用线程,它会运行得完美无缺。如果我在运行时将所有调用都放在facetracker()构造函数中,则在循环开始之前,将摄影机的初始化移到
facetracker::run()
的开头。过去我已经成功地从另一个线程抓取帧。不幸的是,我现在没有那个代码。您使用的是哪个OpenCV版本?
capture = cvCaptureFromCAM(0);
if (!capture)
{
  qDebug("cvCaptureFromCAM failed!");
  //exit(0); or whatever
}
cvNamedWindow("video DisplUM", CV_WINDOW_AUTOSIZE);