我正在使用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");
即取消注释,程序显示完美但有一个我不想要或不需要的窗口(命名测试)。任何人
答案 0 :(得分:3)
答案 1 :(得分:2)
cv :: waitkey是opencv显示窗口的gui循环的一部分
如果您只想等待按键,请参阅QWaitcondition。
或者你可以显示另一个没有图像的命名窗口,或者一个小的1,1像素图像,只是忽略窗口
答案 2 :(得分:1)
我找到了使用msleep()
的解决方案。它很容易使用,因为它是类QThread
的成员。
我想我会更新这个以防有类似问题的人找到这个帖子。
答案 3 :(得分:0)
您可以打电话
qApp->processEvents();
代替
cv::waitKey(40);
在循环中使您的应用程序具有响应能力,并让循环的其余部分完成其工作。