Qt5.6+OpenCV3.2实现rtsp流媒体播放

因为竞争对手有界面,所以我们也要做界面.................

选择了qt做界面,毕竟Linux下可选的不多。

OpenCV 用来处理视频流,还好不用处理音频,不然还要加上FFmpeg了。

Qt使用QLabel显示图片,用定时器刷新。

 

中间遇到了图像显示扭曲,和颜色不正确问题。

OpenCV中颜色是BGR,Qt中是RGB 需要用cvtColor转换一下;

另一点是QImage初始化,要对齐

        qimg = QImage((const uchar*)(mat.data),  //(const unsigned char*)
                     mat.cols,mat.rows,
                     mat.cols*mat.channels(),   //new add
                     QImage::Format_RGB888);

 

代码:

main.cpp

#include "mainwin.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWin w;
    w.show();

    return a.exec();
}
 

mainwin.cpp

#include "mainwin.h"
#include "ui_mainwin.h"
#include "iostream"
#include <QDebug>

using namespace cv;
using namespace std;

MainWin::MainWin(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWin)
{
    ui->setupUi(this);
    video=cv::VideoCapture("rtsp://admin:mima@192.168.5.65:554/h264/ch1/sub/av_stream");
    double rate= video.get(CV_CAP_PROP_FPS);
    qDebug() << "rate:" << rate;
}

MainWin::~MainWin()
{
    delete ui;
}


void MainWin::on_pushButton_clicked()
{
    timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(getframe()));
    timer->start(5);        //为避免出现延时累积,每5毫秒刷新界面


}

void MainWin::getframe()
{
    video>>src_frame; //从视频取帧
    if(!src_frame.data)timer->stop();//如果取不到数据,终止计时器


    Size dsize = Size(ui->label_left_in->width(),
                      ui->label_left_in->height());
    cv::resize(src_frame, src_frame, dsize );

    if(src_frame.channels() == 3) {   // RGB image
        cvtColor(src_frame,src_frame,CV_BGR2RGB);
        qimg = QImage((const uchar*)(src_frame.data),  //(const unsigned char*)
                     src_frame.cols,src_frame.rows,
                     src_frame.cols*src_frame.channels(),   //new add
                     QImage::Format_RGB888);
    }else {                     // gray image
        qimg = QImage((const uchar*)(src_frame.data),
                     src_frame.cols,src_frame.rows,
                     src_frame.cols*src_frame.channels(),    //new add
                     QImage::Format_Indexed8);
    }
    //ui->label->clear();
    ui->label_left_in->setPixmap(QPixmap::fromImage(qimg));
}
 

mainwin.h

#ifndef MAINWIN_H
#define MAINWIN_H

#include <QMainWindow>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
//#include <opencv2/core.hpp>
//#include <opencv2/highgui.hpp>
//#include <opencv2/imgproc.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <QTimer>

namespace Ui {
class MainWin;
}

class MainWin : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWin(QWidget *parent = 0);
    ~MainWin();

private:
    Ui::MainWin *ui;
    cv::VideoCapture video;
    cv::Mat src_frame;
    QTimer *timer;
    QImage qimg;

private slots:
    void getframe();
    void on_pushButton_clicked();
};

#endif // MAINWIN_H
 

结果:

 

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页