0

我想在 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 秒后捕获图像。唯一的问题是捕获屏幕(可以用作实时流)。没有显示在“Lable_2”中。在不使用 OpenCV 库的情况下有没有办法做到这一点?如果没有,请告诉我如何使用 OpenCV 进行操作。

谢谢

4

2 回答 2

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;
}
于 2018-12-05T16:34:24.433 回答
0

使用 流式传输相机OpenCV,并显示它QLabel是可能的。当 QCamera 不工作,并且在项目中使用 OpenCV 时,可以使用VideoCapture流式传输视频而不是 QCamera。

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

  1. 创建一个QThread用于流式传输(不要让 GUI 线程阻塞)。
  2. 在子线程中,使用cv::VideoCapture将帧捕获到cv::Mat.
  3. 转换cv::MatQImage如何将 opencv cv::Mat 转换为 qimage)。
  4. QImage将帧从子线程传递到主 GUI 线程。
  5. QImage在上涂漆QLabel

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

于 2018-12-07T10:05:43.947 回答