gpt4 book ai didi

c++ - 是否可以从 QThread 内部使用 opencv 函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:54:09 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

像你一样,我有experienced problems试图做到这一点。您可能希望将绘制 GUI 的代码移至第二个线程,并保留主线程用于 OpenCV 调用、帧抓取和所有其他操作。

关于c++ - 是否可以从 QThread 内部使用 opencv 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12463135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com