这可能是一个非常愚蠢的问题,但我真的得到了堆栈。
在这里,我试图在QLabel
中逐帧显示视频。在用户界面中,有QPushButton
点击哪个用户可以选择视频。然后获取视频文件的QString
,然后将其转换为cv::String
,以便可以使用OpenCV
库加载视频。加载后,Mat3b
中的每个cv::video
类型框架都会转换为QImage
,以便这些框架可以显示在QLabel
中。但是当我运行此程序时,QLabel
没有显示视频。过了一会儿,它显示出Project.exe is not responding
。
这可能有点复杂,但是已经这样做了,如果需要,可以在每个帧上应用一些特定的OpenCV方法。这是一些代码,负责这一点。
void MainWindow::on_Browse_clicked()
{
QFileDialog dialog(this);
dialog.setNameFilter(tr("Videos (*.avi)"));
dialog.setViewMode(QFileDialog::Detail);
QString videofileName = QFileDialog::getOpenFileName(this, tr("Open
File"), "C:/", tr("Videos (*.avi)"));
if(!videofileName.isEmpty())
{
String videopath;
videopath = videofileName.toLocal8Bit().constData();
bool playVideo = true;
VideoCapture cap(videopath);
if(!cap.isOpened())
{
QMessageBox::warning(this, tr("Warning"),tr("Error loadeing
video."));
exit(0);
}
Mat frame;
while(1)
{
if(playVideo)
cap >> frame;
Mat3b src=frame;
QImage dest= Mat3b2QImage(src); //To convert Mat3b to QImage
ui->label->setPixmap(QPixmap::fromImage(dest));
if(frame.empty())
{
QMessageBox::warning(this, tr("Warning"),tr("Video frame
cannot be openned."));
break;
}
}
}
}
但是当我在最后三个大括号括号之前添加以下几行时,QLabel
和cv::window
都会显示视频。
imshow("Video",src);
char key = waitKey(10);
if(key == 'p')
playVideo = !playVideo;
if(key == 'q')
break;
但我不想显示cv::window
。任何人都可以帮我修复它吗?我感谢任何帮助。
提前谢谢。
答案 0 :(得分:1)
GUI线程忙于无限while
循环,因此您永远不会让Qt有机会更新GUI。
您应该在循环中添加QApplication::processEvents
,其中:
处理调用线程[...]的所有待处理事件。
当程序忙于执行长时间操作时,您可以偶尔调用此功能