【发布时间】:2012-09-17 16:07:49
【问题描述】:
我打算编写一个 Qt GUI 应用程序来处理大量图像。为了不冻结显示,我打算将计算放到QThread,因为某些计算可能在几秒钟的范围内。
我设法集成了 Qt 和 opencv 2.31,并成功地从主 (GUI) 线程运行了一些测试:创建图像、在图像上绘图、执行基本算法并在 cvNamedWindow 中显示它们。一切正常。
但是,如果我启动 QThread 并将之前的测试移到那里,就会发生奇怪的事情:
- 分配图像或从文件中打开它们,在它们上绘图(例如
cvLine)工作正常(我可以将它们发送到 GUI 线程并显示它们) -
执行大部分转换会使应用程序崩溃(例如
cvSmooth) - 使用显示函数(例如
cvNamedWindow,cvShowImage)不起作用,但至少它们不会导致程序崩溃,只发送“QPixmap:在GUI线程之外使用pixmaps是不安全的" 到 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
【问题讨论】:
标签: c++ c multithreading qt opencv