【问题标题】:Is it possible to use opencv functions from inside of a QThread?是否可以从 QThread 内部使用 opencv 函数?
【发布时间】:2012-09-17 16:07:49
【问题描述】:

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

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

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

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


    【解决方案1】:

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

    和你一样,我已经 experienced problems 尝试完成此任务。您可能希望将绘制 GUI 的代码移至第二个线程,并将主线程保留用于 OpenCV 调用、帧抓取和所有这些东西。

    【讨论】:

    • 奇怪的是,链接项目使用 GUI 的主线程和 opencv 的另一个线程,带有互斥锁。对我来说它仍然不起作用。仅使用互斥锁锁定我在问题中提供的示例不会改变其行为。
    • 顺便说一句,为什么互斥锁应该在这种情况下有所帮助?它们仅在可以从多个线程调用相同代码的情况下才有帮助。这不是这里的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多