QT使用Opencv打摄像头TCP实时传送视频
打开摄像头,手动连接到服务器,当连接成功后定时把图片数据发送到时服务器,并在服务器实时显示。
在此感谢CSDN的大佬,主要参考https://blog.csdn.net/yang_xiaobai/article/details/100660041
Opencv的移植是按书《QTQt 5开发及实例 含典型案例视频分析 第4版》移植的。
一、环境
QT5.14.2
qt creator 4.11.1
opencv3.4.3
第一次使用QT如果有错,请指出,联系QQ:330313007。
不多说 ,直接上代码。
二、客户端
mainwindow.h:
```cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpSocket>
#include <QTcpServer>
#include <QBuffer>
#include <iostream>
#include <QThread>
#include <opencv2/opencv.hpp>
#include <QTimer>
using namespace cv;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void BtnOpenCamera();
void BtnCloseCamera();
void TimeSendData();
void BtnConnectSlot();
void BtnOffSlot();
void connect_suc();
void client_dis();
void getFrame();
private:
Ui::MainWindow *ui;
QImage qImg;
QTcpSocket* mSocketM;
QPixmap tempPixmapM;
QTimer *timerGetFrame; // 定时器用于定时取帧,上面说的隔一段时间就去取就是用这个实现
QTimer *timerSendData; // 定时器用于定时取帧,上面说的隔一段时间就去取就是用这个实现
VideoCapture capture;//有溢出
quint32 ConnectFlg; // 连接标记
};
#endif // MAINWINDOW_H
mainwindow.cpp
```cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
timerGetFrame = new QTimer(this);
timerSendData = new QTimer(this);
connect(timerGetFrame, SIGNAL(timeout()), this, SLOT(getFrame())); // 定时获取帧
connect(timerSendData, SIGNAL(timeout()), this, SLOT(TimeSendData())); // 定时获取帧
connect(ui->BtnOpenCamera, SIGNAL(clicked()), this, SLOT(BtnOpenCamera())); // 打开摄像头
connect(ui->BtnCloseCamera, SIGNAL(clicked()), this, SLOT(BtnCloseCamera())); // 关闭摄像头
connect(ui->btnConnect, SIGNAL(clicked()), this, SLOT(BtnConnectSlot())); // 连接
connect(ui->btnOff, SIGNAL(clicked()), this, SLOT(BtnOffSlot())); // 断开
// 初始化套接字对象
mSocketM = new QTcpSocket();
}
MainWindow::~MainWindow()
{
delete ui;
delete mSocketM;
}
void MainWindow::BtnOpenCamera()
{
capture.open(0); // 打开摄像头,从摄像头中获取视频
qDebug()<<"Open Camera success!";
timerGetFrame->start(33); // 开始计时,超时则发出timeout()信号, 1000为1秒,50毫秒取一帧
}
// 关闭摄像头,并关闭连接
void MainWindow::BtnCloseCamera()
{
qDebug()<<"Close Camera success!";
timerGetFrame->stop(); // 停止取帧
capture.release(); //释放资源