是否可以从 QThread 内部使用 opencv 函数?
Posted
技术标签:
【中文标题】是否可以从 QThread 内部使用 opencv 函数?【英文标题】:Is it possible to use opencv functions from inside of a QThread? 【发布时间】: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
【问题讨论】:
【参考方案1】:It is possible,但 OpenCV 不是为支持来自不同线程的调用而构建的。所以你需要在你的代码中使用mutexes。
和你一样,我已经 experienced problems 尝试完成此任务。您可能希望将绘制 GUI 的代码移至第二个线程,并将主线程保留用于 OpenCV 调用、帧抓取和所有这些东西。
【讨论】:
奇怪的是,链接项目使用 GUI 的主线程和 opencv 的另一个线程,带有互斥锁。对我来说它仍然不起作用。仅使用互斥锁锁定我在问题中提供的示例不会改变其行为。 顺便说一句,为什么互斥锁应该在这种情况下有所帮助?它们仅在可以从多个线程调用相同代码的情况下才有帮助。这不是这里的情况。以上是关于是否可以从 QThread 内部使用 opencv 函数?的主要内容,如果未能解决你的问题,请参考以下文章