3

我正在使用 Qt 编写一个 GUI 程序并使用 OpenCV 进行一些视频处理。我在主 GUI 线程的标签中显示 OpenCV 进程的结果(在单独的线程中)。

我遇到的问题是 cv::waitKey 不起作用,除非我打开使用 cv::namedWindow 或 cv::imshow 打开的本机 OpenCV 窗口。有谁知道如何解决这个问题?

简短的例子:

void Thread::run()
{
    //needed variables
    cv::VideoCapture capture(0);
    cv::Mat image;

    //main loop
    //cv::namedWindow("test");
    forever
    {
        capture>> image;
        if(!image.data)
            break;
        emit paintToDisplay(convertToQImage(image));
        cv::waitKey(40);
    }
}

带有//cv::namedWindow("test");ie 注释,程序因访问冲突错误而崩溃。

没有注释,程序显示完美,但有cv::namedWindow("test");一个窗口(名为测试)我不想要或不需要。有人吗?

4

4 回答 4

4

cv::waitKey()仅适用于 OpenCV 窗口,这不是您现在使用的。

我建议您调查一个 QT 替代方案,很可能qSleep()是由QTest模块提供的:

QTest::qSleep(40);
于 2012-05-17T14:35:41.977 回答
2

cv::waitkey 是 opencv 用于显示窗口的 gui 循环的一部分

如果您只是想等待按键,请参阅QWaitcondition

或者,您可以显示另一个没有图像的命名窗口,或者显示一个 1,1 像素的小图像而忽略该窗口

于 2012-05-17T14:18:51.367 回答
1

我找到了使用的解决方案msleep()。它很容易使用,因为它是类的成员QThread

只是想我会更新这个,以防有类似问题的人找到这个线程。

于 2012-05-17T22:51:25.540 回答
1

你可以打电话

qApp->processEvents();

代替

cv::waitKey(40);

在循环中使您的应用程序响应并让循环的其余部分完成他们的工作。

于 2019-09-28T17:59:59.840 回答