不需要先调用cv::namedWindow或cv::imshow就可以使用cv::waitKey吗?

3

我正在使用Qt编写GUI程序,同时使用OpenCV进行视频处理。我正在在主GUI线程中的标签中显示OpenCV过程的结果(该过程在单独的线程中执行)。

我的问题在于,除非我使用cv::namedWindow或cv::imshow打开本机OpenCV窗口,否则cv::waitKey不起作用。有人知道如何解决这个问题吗?

下面是一个简短的示例:

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");即注释掉该行,程序会崩溃并显示访问冲突错误。

使用cv::namedWindow("test");即取消注释该行,程序可以完美运行,但会出现一个我不需要的窗口(名为test)。 有没有人可以提供帮助?


重新阅读您的问题,使用namedWindow()时有一种行为,然后再次使用namedWindow()时有另一种行为,这是没有意义的。 - karlphillip
一个已经注释了,另一个没有注释。 - Dyps
@karlphillip 我已经编辑过了,使其更加清晰明了。 - Dyps
4个回答

4

cv::waitKey() 只能用于OpenCV窗口,而您现在使用的不是这种窗口。

我建议您探索一下QT的替代方案,最有可能的是qSleep(),它由QTest模块提供:

QTest::qSleep(40);

1
我认为waitKey()不能自主运行有点傻。我找到了解决方法:msleep()。它是类QThread的成员。 - Dyps

2

cv::waitKey 是 OpenCV 的 GUI 循环中用于显示窗口的一部分。

如果你只想等待按键,请参考QWaitcondition

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


1

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

只是想更新一下,以防有类似问题的人发现这个线程。


1
你可以打电话。
qApp->processEvents();

替代

cv::waitKey(40);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接