在Qt中实现视频显示

3
当我点击标有“从网络摄像头选择视频”的按钮时,它会从网络摄像头中捕获视频。但是父窗口挡住了当前播放的视频,或者当前正在播放的视频在父窗口后面。我正在进行人脸识别项目,使用Qt创建前端。我应该怎么做才能让视频一直在所有父窗口前面,直到视频结束?
void admin_db_creation::on_pushButton_3_clicked()
  {
capture = cvCaptureFromCAM(0);
    if(!capture)
        {
            cout<<"Could not initialize capturing..."<<endl;
        }
    while(1)
        {
            frame2 = cvQueryFrame(capture);
            frame3=detectFace(frame2);
            imshow("window", frame2);
            char key = cvWaitKey(10);
                if (key == 27)
                        break;
        }
 }

这是一个按钮点击的代码,其中包含播放视频的代码。

1
不太明白问题。也许你可以放一张截图? - guneykayim
如果我们不知道您如何播放视频,我们怎么能帮助您呢?请发布代码。 - Matteo Italia
你需要添加用于创建播放视频的窗口的代码。 - Nicholas Smith
确保您的视频小部件已正确设置其父级,并确保父窗口未设置保持顶部提示。 - ismail
1
你的问题不够清晰。或许你可以尝试添加更多的截图/代码来使工作流程更加明确。 - Abhishek Bansal
2
你的 while(1) 循环可能会阻塞主 Qt GUI 更新线程。其次,imshow() 根本与 Qt 无关。你可能想要将视频图像渲染到 QLabel 或其他控件上,而不是从 Qt 中调用 OpenCV 的 imshow() 函数。最后,你可能只想使用 Qt 作为控制应用程序,并使用 OpenCV 在单独的窗口中显示视频。 - PurpleAlien
2个回答

6
问题在于你混淆了事件循环。
Qt 提供了自己的事件循环来处理所有系统事件,包括鼠标和键盘。 当你使用 char key = cvWaitKey(10); 时,你会创建另一个事件循环,这个事件循环仅由 OpenCV 提供,仅用于测试目的。
这是 Qt 代码,所以不要使用这个无限循环(对 Qt 来说它是无限循环),而是创建一个 slot,它将获取单帧并处理它(显示它),并使用 QTimertimeout 信号)重复调用它。 放弃 OpenCv 的 UI 功能。只使用图像处理函数,什么也不要用。
这里有一个类似的问题。这里还有一些关于这个主题的有用信息

2

首先,将您的图像从cv::Mat转换为QImage。然后在GUI上使用QLabel显示它。忘记OpenCV highgui模块,它无法与Qt GUI兼容!

1)转换示例:

// Mat __cvFrame is your OpenCV image, 
QImage __frame; 
if (__cvframe.channels()==3)
{
   Mat __cvRGBframe;
   cvtColor(__cvframe,__cvRGBframe,CV_BGR2RGB);
   __frame = QImage((const unsigned char*)(__cvRGBframe.data),
               __cvRGBframe.cols,__cvRGBframe.rows,QImage::Format_RGB888);
}
else
{
   __frame = QImage((const unsigned char*)(__cvframe.data),
                         __cvframe.cols,__cvframe.rows,QImage::Format_Indexed8);
}

2) 将您的QImage放置在QLabel上:

// QLabel* label has to exist in your GUI :)
label->setPixmap(QPixmap::fromImage(__frame));
label->setScaledContents(true);

是的,我们可以使用这段代码在QLabel中显示视频,但是如果不使用'imshow'函数,我们无法查看视频,但是在后台摄像头正在捕获帧。当我们使用'imshow'函数时,我们可以在QLabel中查看视频,并同时在opencv窗口中显示相同的视频。 - user3228547
你不能同时使用QtGUI和OpenCV UI工具。正如Marek和我所指出的:“忘记来自OpenCv的UI功能吧”。 - Яois
好的,我接受。但是如果没有使用“imshow”函数,视频将无法显示在QLabel中。 - user3228547
这不是真的。 imshow 控制 OpenCV UI 窗口中的可视化。我使用基于 Qt 的 GUI 来显示使用 OpenCV 处理的图像,并且它能够正常工作,就像我建议的那样。如果视频没有显示出来,那就必须有其他原因。 - Яois

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