DSP

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

2019-07-13 15:04发布

因为竞争对手有界面,所以我们也要做界面................. 选择了qt做界面,毕竟Linux下可选的不多。 OpenCV 用来处理视频流,还好不用处理音频,不然还要加上FFmpeg了。 Qt使用QLabel显示图片,用定时器刷新。   中间遇到了图像显示扭曲,和颜 {MOD}不正确问题。 OpenCV中颜 {MOD}是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 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 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
#include
#include
//#include
//#include
//#include
#include
#include 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
  结果: