使用 cv::waitKey,而不必先调用 cv::namedWindow 或 cv::imshow

Using cv::waitKey without having to call cv::namedWindow or cv::imshow first

本文关键字:cv 调用 namedWindow imshow waitKey 使用 不必      更新时间:2023-10-16

我正在使用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");即注释,程序崩溃并出现访问冲突错误。

有了cv::namedWindow("test");即未注释,程序显示完美,但有一个我不想要或不需要的窗口(命名测试)。任何人?

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

我建议您研究QT替代方案,很可能是qSleep(),它由QTest模块提供:

QTest::qSleep(40);

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

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

或者

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

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

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

你可以

调用

qApp->processEvents();

而不是

cv::waitKey(40);

使应用程序响应,并让循环的其余部分完成其工作。