原文地址::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
结果: