проблема с отображением живого видео в приложении qt c ++ - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу показать живой поток камеры, подключенной к raspberry, в приложении qt (ОС 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.

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Потоковая камера с использованием OpenCV, и показать его в QLabel возможно.Когда QCamera не работает, а также использует OpenCV в проекте, можно использовать VideoCapture для потоковой передачи видео вместо QCamera.

Проблема может быть разбита на несколько этапов.В общем, нам нужно:

  1. Создать QThread для потоковой передачи (Не позволяйте потоку GUI заблокировать).
  2. В подпотоке, используя cv::VideoCapture для захватакадр в cv::Mat.
  3. Преобразование cv::Mat в QImage ( как конвертировать opencv cv :: Mat в qimage ).
  4. PassQImage кадр из подпотока в основной поток GUI.
  5. Нарисуйте QImage на QLabel.

Я поместил полный демонстрационный код в Github .это может нарисовать кадр на QLabel и QML VideoOutput.

0 голосов
/ 05 декабря 2018

Это довольно просто в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...