是否可以在QThread中使用opencv函数?

时间:2012-09-17 16:07:49

标签: c++ c multithreading qt opencv

我打算编写一个Qt GUI应用程序,它可以进行大量的图像处理。为了不冻结显示,我打算将计算放到QThread,因为有些计算可能在几秒钟的范围内。

我设法集成了Qt和opencv 2.31,并且我成功地从主(GUI)线程运行了一些测试:创建图像,绘制图像,执行基本算法,并在cvNamedWindow中显示它们。一切正常。

但是,如果我开始QThread并将之前的测试移到那里,会发生奇怪的事情:

  • 分配图像或从文件中打开图像,在图纸上绘图(例如cvLine)工作正常(我可以将它们发送到GUI线程并显示它们)
  • 执行大部分转换会导致应用程序崩溃(例如cvSmooth
  • 使用显示功能(例如cvNamedWindowcvShowImage)不起作用,但至少它们不会导致程序崩溃,只发送“QPixmap:使用pixmaps是不安全的在GUI线程之外“到Qt调试输出。 (我理解这一点,因为cvNamedWindow在Qt和Qt中实现,只允许从主GUI线程显示)

有没有办法从主线以外的线程使用图像处理功能?在主线程中进行边缘检测等会更直观,更不用说分段或其他资源丰富的算法...

<子> 这是一个在主(GUI)线程中工作的示例,但在QThread中不起作用。这只使用C API,因为C ++ API在Qt下给了我更多的问题。这意味着C解决方案也足够了,但我对使用C ++ API的其他解决方案持开放态度。

IplImage *test;
test = cvCreateImage( cvSize(640,480), 8, 1 );
cvLine(test,cvPoint(20,20),cvPoint(100,100),cvScalar(255,0,0),3);  // works fine even in thread
cvSmooth( test, test, CV_GAUSSIAN, 11, 11 );                       // crashes if in thread
cvNamedWindow("test");                                             // warning if in thread
cvShowImage("test",test);                                          // warning if in thread

1 个答案:

答案 0 :(得分:2)

It is possible,但OpenCV不是为支持来自不同线程的调用而构建的。因此,您需要在代码中使用mutexes

和你一样,我experienced problems试图做到这一点。您可能希望将绘制GUI的代码移动到第二个线程,并保留为OpenCV调用,帧抓取和所有内容保留的主线程。