我打算编写一个 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