2

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

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

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

  • 分配图像或从文件中打开它们,在它们上绘图(例如cvLine)工作正常(我可以将它们发送到 GUI 线程并显示它们)
  • 执行大多数转换会使应用程序崩溃(例如cvSmooth
  • 使用显示功能(例如cvNamedWindow, cvShowImage)不起作用,但至少它们不会导致程序崩溃,只会将“QPixmap:在 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

4

1 回答 1

2

这是可能的,但 OpenCV 不是为支持来自不同线程的调用而构建的。因此,您需要在代码中使用互斥锁

像你一样,我在尝试实现这一点时遇到了问题。您可能希望将绘制 GUI 的代码移至第二个线程,并将主线程保留用于 OpenCV 调用、帧抓取和所有这些东西。

于 2012-09-17T16:40:20.710 回答