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

时间:2012-05-17 14:06:14

标签: c++ qt opencv

我正在使用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");即取消注释,程序显示完美但有一个我不想要或不需要的窗口(命名测试)。任何人

4 个答案:

答案 0 :(得分:3)

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

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

QTest::qSleep(40);

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

我想我会更新这个以防有类似问题的人找到这个帖子。

答案 3 :(得分:0)

您可以打电话

qApp->processEvents();

代替

cv::waitKey(40);

在循环中使您的应用程序具有响应能力,并让循环的其余部分完成其工作。