To Display Video Frame on QML



  • I am using opencv to display video frames from web cam on Qt gui. Now I have planed to display it on QML window(without Qt gui). I was trying to use qdeclarative view but I didn't succeed.
    I am attaching the source code for displaying the video on label. In the code I used label (labelInputVideo) and push button to start the frames. Is it possible to display qimage directly on qml.
    Thanks in advance

    mainwindow.h
    @
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include <QFileDialog>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    #include <QTimer>
    //#include <dialog.h>
    #include<QLabel>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QImage qimg;

    private slots:
    void on_pushButton_clicked();

    public slots:
    virtual void Frame() ;

    private:

    cv::Mat image; // the image variable
    Ui::MainWindow *ui;
    CvCapture *capture;          // OpenCV Video Capture Variable
    IplImage *frame;            // Variable to capture a frame of the input video
    cv::Mat source_image;     // Variable pointing to the same input frame
    QTimer *imageTimer;
    

    };

    #endif // MAINWINDOW_H
    @

    main.cpp
    @
    #include <QtGui/QApplication>
    #include "mainwindow.h"

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
    }
    @

    mainwindow.cpp
    @
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <iostream>
    #include <QDeclarativeView>
    #include <QDeclarativeComponent>
    #include <QDeclarativeItem>
    #include<QGridLayout>
    #include<QDesktopWidget>

    using namespace cv;
    Mat cameraFrame;

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);

    const int imagePeriod = 1000/25;   // ms
    
    imageTimer = new QTimer(this);
    
    imageTimer->setInterval(imagePeriod);
    
    connect(imageTimer, SIGNAL(timeout()), this, SLOT(Frame()));
    
    // Use the default camera
    capture = cvCaptureFromCAM( CV_CAP_ANY );//cvCreateCameraCapture(0);
    

    }

    MainWindow::~MainWindow()
    {
    delete ui;
    cvReleaseImage(&frame);
    cvReleaseCapture(&capture);
    }

    void MainWindow::on_pushButton_clicked()
    {
    if( imageTimer->isActive() )
    {
    imageTimer->stop();
    }
    else
    {
    imageTimer->start();
    }

    }

    void MainWindow::Frame(){
    // Capture a frame
    frame = cvQueryFrame(capture);

    // Point to the same frame
    source_image = frame;
    
    // Resize Image
    cv::resize(source_image, source_image, cv::Size(1080,960) , 0, 0);
    
    // Change to RGB format
    cv::cvtColor(source_image,source_image,CV_BGR2RGB);
    
    
    // Convert to QImage
    QImage qimg = QImage((const unsigned char*) source_image.data, source_image.cols, source_image.rows, QImage::Format_RGB888); // convert to QImage
    
    ui->labelInputVideo->setPixmap(QPixmap::fromImage(qimg));
    
    // Resize the label to fit the image
    ui->labelInputVideo->resize(ui->labelInputVideo->pixmap()->size());
    

    }
    @



  • So. Have you managed to do that? I am trying it too with no success. :(


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.