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

原文地址::https://www.pianshen.com/article/4830356549/

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

选择了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
 

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值