在Qt C ++应用程序中显示实时视频的问题

时间:2018-12-05 16:05:10

标签: c++ qt raspberry-pi live-streaming live-video

我想在qt应用程序(OS Linux)中显示连接到树莓的相机的实时流。谷歌搜索之后,我发现我必须在QLabel中显示视频。当显示图像时没有问题,一切正常,但是当我想在QLabel中显示实时流时,实时流窗口将单独打开(不在QLabel内部)。你能告诉我如何解决这个问题吗?这是我的代码:

void Dialog::on_Preview_clicked()
{
    command = "raspistill";
    args<<"-o"<<"/home/pi/Pictures/Preview/"+Date1.currentDateTime().toString()+".jpg"<<"-t"<<QString::number(20000);
    Pic.start(command,args,QIODevice::ReadOnly);
    QPixmap pix("//home//pi//Pictures//Preview//test.jpg");
    ui->label_2->setPixmap(pix);
    ui->label_2->setScaledContents(true);
}

此代码将打开视频捕获屏幕,并在20秒后捕获图像。唯一的问题是捕获屏幕(可以用作实时流)。没有显示在“标签_2”中。无论如何,不​​使用OpenCV库就可以做到这一点吗?如果没有,请告诉我如何使用OpenCV。

谢谢

2 个答案:

答案 0 :(得分:0)

在opencv中非常简单

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

 int main( int argc, char** argv )
 {
        VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat edges;
    namedWindow("edges",1);
    for(;;)
    {
        Mat frame;

        cap >> frame; // get a new frame from camera

        imshow("edges", frame);
        if(waitKey(30) >= 0) break;
    }
return 0;
}

答案 1 :(得分:0)

使用OpenCV流式传输相机,并以QLabel进行显示。 如果QCamera无法正常工作,并且在项目中也使用OpenCV,则可以使用VideoCapture代替QCamera来流式传输视频。

该问题可以分解为几个步骤。基本上,我们需要:

  1. 创建一个QThread进行流传输(不要阻止GUI线程)。
  2. 在子线程中,使用cv::VideoCapture将帧捕获到cv::Mat中。
  3. cv::Mat转换为QImagehow to convert an opencv cv::Mat to qimage)。
  4. QImage帧从子线程传递到主GUI线程。
  5. QImage上绘制QLabel

我将完整的演示代码放在Github中。可以在QLabel和QML VideoOutput上绘制边框。