【问题标题】:Making video visible in Qt使视频在 Qt 中可见
【发布时间】:2014-04-30 05:02:46
【问题描述】:

我正在做一个人脸识别项目。 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;
        }
 }

这是按钮点击代码,它包含播放视频的代码..

【问题讨论】:

  • 不明白问题所在。能不能放个截图?
  • 如果我们不知道您是如何播放视频的,我们该如何帮助您?贴出代码。
  • 您需要添加用于创建播放视频的窗口的代码。
  • 你的问题不清楚..可以尝试放更多截图/代码以使工作流程清晰
  • 您的 while(1) 循环可能阻塞了主 Qt gui 更新线程。其次, imshow() 根本与 Qt 无关。您可能希望将视频图像渲染到 QLabel 或其他东西,而不是从 Qt 的 OpenCV 调用 imshow()。最后,您可能只想使用 Qt 作为控制应用程序并使用 OpenCV 在单独的窗口中显示视频。

标签: c++ qt opencv


【解决方案1】:

问题是您正在混合事件循环。

Qt 提供自己的事件循环来处理所有系统事件,包括鼠标和键盘。 当您使用char key = cvWaitKey(10); 时,您会创建另一个由 OpenCV 提供的事件循环,仅用于测试目的。

这是 Qt 代码,所以使用这个不定式循环(对于 Qt 它是不定式),创建一个槽来获取单个帧并处理它(显示它)并使用QTimertimout 信号)重复调用它. 忘掉 OpenCv 的 UI 特性吧。从 OpenCv 只使用图像处理函数,没有别的。

这里是类似的problem。和here is something that may be also useful 这个话题。

【讨论】:

    【解决方案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 窗口中显示相同的视频。
    • 您不能同时使用 QtGUI 和 OpenCV UI 工具。正如 Marek 和我自己指出的那样:“忘记 OpenCv 的 UI 功能”。
    • 好的,我接受。但不提供“imshow”功能,QLabel 中不会显示视频。
    • 这不是真的。 imshow 控制 OpenCV UI 窗口中的可视化。我使用基于 Qt 的 GUI 来显示正在使用 OpenCV 处理的图像,并且它可以按照我建议的方式工作。如果视频没有显示,肯定有其他原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2020-06-17
    • 2012-09-28
    • 1970-01-01
    相关资源
    最近更新 更多