QT 短时间大量图片传输,实现监控效果 (实时视屏传输) (暴力模式)

news2024/11/19 11:17:57

1.首先需要知道的知识

1.我使用的是 TCP 协议传输 ,因为传输数据准确一点,

2. 然后是  套接字的 信号 ,  readyRead( ) ,这个信号的功能是只要套接字里面的 缓存区有数据,他就会发出这个信号。

3.我们传输数据有时候,会出现 粘包和封包的情况,可能读取函数不能一次性的把数据读取。

4.所以我们传输数据的时候需要, 传输   一个  标志位, 一个数据的大小, 数据,三个数据。

                         标志位的作用: 标志新的数据从这里开始传输, 

                         数据大小的作用: 可以明确的说明我们这次传输的图片数据的大小

                         数据: 图片的数据,转化为二进制。

5.发送一个图片需要  发送三次数据, 就是 利用套接字 的write 函数。(使用 write 三次)


  2.代码解释,

发送模块:

QBuffer 类型

QBuffer为Qtl里面的缓冲区类

缓冲区的本质就是一段连续的存储空间

 QImage 类型的 保存函数, 他把 image 图片的数据保存在 buff 里面 


接收模块:

 1.首先 我们接收函数包括这一部分,然后  因为readRead() 信号,可以在数据读取完之前,无限的调用, 

2.type 是标志位

3.size 是数据的大小,

4. data 是总的数据大小的汇集,最后形成一张图片的数据。


 3.所有的代码:

服务器: pro文件  +  网络的模块

ui 设计界面:

头文件 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMainWindow>
/******* 摄像头相关类 *****/
#include <QCamera> /*** 摄像头类 ***/
#include <QCameraInfo> /*** 系统摄像头属性类 ***/
#include <QCameraImageCapture> /*** 用于记录摄像头数据的类 ***/

#include <QDebug> /*** debug 调试类 ****/
/******* 网络相关类 ****/
#include <QNetworkAccessManager> /** 网络访问类 ***/
#include <QNetworkReply> /** 网络数据结果类 ***/

/******* QJSON 相关类 *****/
#include <QJsonDocument>
#include <QJsonObject>
#include <QMessageBox>

#include <QTcpServer>   /** TCP 服务器类 ***/
#include <QTcpSocket>   /** TCP 套接字类 ***/

#include <QTimer> //定时器
#include <QTime>//时间类

#include <QFile>//文件类
#include <QFileDialog>
#include <QFileInfo>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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


private slots:
    void on_pushButton_open_clicked();

    void on_pushButton_close_clicked();

private:
    Ui::Widget *ui;
    QCamera *m_Camera; /*** 摄像机类对象 ***/
    QCameraImageCapture *CameraImageCapture; /*** 用于记录摄像头数据的类 ***/
    QNetworkAccessManager *m_http; /**网络访问对象 **/
    QTcpServer *sevser;//服务器的套接字的网络对象
    QTimer* timer;//定时器
    QTcpSocket * mycli;//连接的对象
public slots:
    void solt_newConnection();
    void slot_pushButton_play();//拍照按键
    void slot_CameraImageCapture(int id, QImage image);//照片在界面上显示的函数
    void slot_TcpSocket_disconnected();//TCP 断开连接

signals:
    void send();

};

#endif // WIDGET_H

 .cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QBuffer>
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = new QTimer(this);//定时器
    sevser = new QTcpServer(this);
    sevser->listen(QHostAddress::Any,10001);//监听开始
    connect(sevser,SIGNAL(newConnection()),this,SLOT(solt_newConnection()));//建立信号连接 ,与链接的人
    connect(ui->pushButton_play,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_play()));

    //按键的初始化
    ui->pushButton_close->setEnabled(false);//开始的时候 关闭摄像头的按钮不使能

}

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

void Widget::on_pushButton_open_clicked()//打开摄像头
{
        ui->pushButton_open->setEnabled(false);//打开摄像头的按钮 不使能
        ui->pushButton_close->setEnabled(true);//关闭摄像头的按钮 使能
        /**** 摄像头初始化 ****/
        QCameraInfo camreinfo = QCameraInfo::defaultCamera(); /*** 获取系统默认摄像头 ***/
        if(camreinfo.isNull() == true)
        {
            QMessageBox::warning(this,"警告","系统没有可用摄像头");
            return ;
        }
        /**** 申请摄像头类空间 ****/
        m_Camera = new QCamera(camreinfo); // 直接使用系统默认的
        m_Camera->setCaptureMode(QCamera::CaptureStillImage);				//设置捕捉模式为静态帧(图片形式)
        m_Camera->setCaptureMode(QCamera::CaptureMode::CaptureViewfinder);	//将采集到取景器中
        m_Camera->setViewfinder(ui->widget); //将摄像头数据输出到 UI 界面显示
        m_Camera->start(); //摄像头打开

        /***** 将摄像头放入摄像头记录类中,方便拍照 ******/
        CameraImageCapture = new QCameraImageCapture(m_Camera);
        CameraImageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);
        /*********** 捕获信号函数 imageCaptured(int,QImage) 拍了一张照,发出该信号 ********/
        connect(CameraImageCapture,SIGNAL(imageCaptured(int,QImage)),this,SLOT(slot_CameraImageCapture(int,QImage)));

}

void Widget::on_pushButton_close_clicked()//关闭摄像头
{
    ui->pushButton_close->setEnabled(false);//关闭摄像头的按钮 不使能
    ui->pushButton_open->setEnabled(true);//开启摄像头的按钮使能
    delete m_Camera; //释放他的空间
    delete CameraImageCapture; //释放他的空间
}

void Widget::solt_newConnection()//连接成功之后的调试
{
    qDebug()<<"连接成功";
    mycli=new QTcpSocket(this);
    mycli= sevser->nextPendingConnection(); //去读已连接客户端挂起的第一个
    connect(mycli,SIGNAL(disconnected()),this,SLOT(slot_TcpSocket_disconnected()));

    QHostAddress hostaddr = mycli->peerAddress(); /** 获取主机信息 **/
    QString ip = hostaddr.toString();
    int port = mycli->peerPort();
    QString PORT = QString::number(port);
    ui->listWidget->addItem(ip + " - " + PORT);//同步插入

    connect(timer,SIGNAL(timeout()),this,SLOT(slot_pushButton_play()));
    timer->start(30);

}

void  Widget::slot_CameraImageCapture(int id, QImage image)
{
    ui->label_3->setPixmap(QPixmap::fromImage(image));
    bool ok = ui->checkBox->isChecked();
    if(ok==true)
    {
        QByteArray data;
        QBuffer buff(&data);
        image.save(&buff,"jpeg");

        u8 type = 0xAA; //接收到0xAA,我的长度来了
        size_t size = data.size();

        mycli->write((char *)&type,sizeof(type)); //发送类型
        mycli->write((char *)&size,sizeof(size)); //发送长度
        mycli->write(data); //发送数据
    }

}



void Widget::slot_TcpSocket_disconnected()
{
    qDebug()<<"TCP连接已经断开";
}


void Widget::slot_pushButton_play()
{
    qDebug()<<"照片存入成功";
    CameraImageCapture->capture("D:/QT/hqyj_coding/day07_video_transmission/gwww.jpg");
}



客户端 

ui 设计界面 ,

头文件,

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    QTcpSocket *TcpSocket;

public slots:
    void slot_TcpSocket_readyRead();
};

#endif // WIDGET_H

.cpp 文件  (地址自己写)

#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    TcpSocket = new QTcpSocket(this);
    TcpSocket->connectToHost(QHostAddress("192.168.111.206"),10001);

    connect(TcpSocket,SIGNAL(readyRead()),this,SLOT(slot_TcpSocket_readyRead()));
}

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

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
void Widget::slot_TcpSocket_readyRead()
{
    static u8 type = 0; //接收到0xAA,我的长度来了
    static size_t size = 0;
    static QByteArray data;

    if(size == 0)
    {
        TcpSocket->read((char *)&type,sizeof(type)); //读取类型
        if(type == 0xAA)
        {
            TcpSocket->read((char *)&size,sizeof(size)); //读取类型
            data.clear();
            type = 0;
        }
    }

    if(size > 0)
    {
        QByteArray buf = TcpSocket->read(size); //读取类型
        data.append(buf);
        size -= buf.size();
        if(size <= 0)
        {
            QImage image = QImage::fromData(data);
            ui->label->setPixmap(QPixmap::fromImage(image));
        }
    }


}


最后结果   

程序有bug  (打开服务器的时候,需要点击打开摄像头,才能连接客户端,!!!!!!!!!)

你们自己改吧,构造的时候调用 按钮的槽函数就行了!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计公共台账管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于intel+fpga平台实现设备AI 和数据转换智能化

通过 AI 和数据转换实现智能设备数字化 数据收集、可视化、自动控制和 AI 分析有效促进了设备智能化 &#xff08;M2I&#xff09; 和工业 AI的螺丝&#xff0c;是推动智能制造向前发展的两个齿轮。通过"设备智能化 "和"工业AI"赋能智能设备功能&#xff…

Kafka如何实现延迟队列?

Kafka并没有使⽤JDK⾃带的Timer或者DelayQueue来实现延迟的功能&#xff0c;⽽是基于时间轮自定义了⼀个⽤于实现延迟功能的定时器&#xff08;SystemTimer&#xff09;。JDK的Timer和DelayQueue插⼊和删除操作的平均时间复杂度为O(nlog(n))&#xff0c;并不能满⾜Kafka的⾼性能…

centOS配置ss5并解决部分出现的问题

文章目录代理服务器socks5协议搭建ss5代理服务器安装ss5修改配置文件添加用户名和密码修改ss5端口修改ss5启动权限启动ss5服务配置socks全局使用qq验证参考代理服务器 实际的工作的有时候需要用到代理服务器&#xff0c;通过代理服务器可以一定程度上隐藏自己的真实IP&#xf…

聚焦 | 千海金与大工科技园“喜结连理” 正式达成战略合作

为贯彻国家碳达峰碳中和相关工作要求&#xff0c;加快实施可再生能源替代行动&#xff0c;推动可再生能源加快步入高质量跃升发展新阶段。12月9日&#xff0c;由千海金集团、大连理工大学科技园联合成立的低碳科技与绿色金融研究中心举行揭牌仪式。 大连市西岗区科工贸副局长李…

nacos--基础--1.3--理论--架构

nacos–基础–1.3–理论–架构 1、基本架构及概念 1.1、服务 (Service) 是指一个或一组软件功能(例如特定信息的检索或一组操作的执行)&#xff0c;其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态&#xff0c;举例如下 Kuber…

[2022-12-11]神经网络与深度学习 hw12 - 小作业

contentshw12 - 不知道该起个什么名字task1题目内容题目分析题目解答题目总结task2题目内容题目分析题目解答题目总结task3题目内容题目分析题目解答题目总结写在最后hw12 - 不知道该起个什么名字 task1 题目内容 在小批量梯度下降中&#xff0c;尝试分析为什么学习率要和批…

苦卷28天,P9大佬给我的Alibaba面试手册!终于成功踹开字节大门

怎么说呢&#xff0c;今年真的是寒气逼人啊&#xff01;在这个大环境下&#xff0c;裁员已经不算是特别的事情&#xff0c;粗暴裁员也许是未来一种趋势…在职的卷的起飞&#xff0c;离职的找不到好工作。 做点能做的&#xff1a;跑跑步骑骑车多锻炼&#xff1b;当当上面正版书…

[附源码]Python计算机毕业设计大学生心理健康管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

eNSP综合实验合集(eNSP综合大作业合集)_可先收藏

作者&#xff1a;BSXY_19计科_陈永跃BSXY_信息学院注&#xff1a;未经允许禁止转发任何内容**注&#xff1a;在该文章中就只对ensp综合实验做一个总结和归纳&#xff0c;只给出相应的topo图和需求说明和对应的文章的连接。有什么问题也可以私信我&#xff0c;看到都会回复的。文…

picoCTF 密码学方向RSA算法做题记录

RSA算法原理&#xff1a; https://blog.csdn.net/qq_45894840/article/details/128204460?spm1001.2014.3001.5502Mind your Ps and Qs 题目描述&#xff1a;In RSA, a small e value can be problematic, but what about N? Can you decrypt this? 下载题目 在这里可以看…

初级软件测试面试会问什么 掌握好这两几个方法,还怕拿捏不住hr?

初级软件测试工程师大多为新入门的小白&#xff0c;在经历面试时&#xff0c;往往也是最忐忑的一部分人&#xff0c;为此&#xff0c;我特为大家整理了一些初级软件测试面试会问的问题&#xff0c;帮助你们在面试时能够从容不迫的回答出hr的问题&#xff0c;拿下offer&#xff…

Python实现PSO粒子群优化卷积神经网络CNN分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一种…

ESB产品UI升级总结

一款好的产品需要不断地打磨才能变得更完整、更稳定。企业服务总线ESB产品作为数通畅联的核心产品&#xff0c;为了能够更好地迎合客户的需求&#xff0c;实现更好的视觉效果和体验感&#xff0c;需要不断地迭代升级。 本次升级主要是针对整体页面进行优化以及对部分功能进行修…

【C++】vector迭代器失效与深浅拷贝问题

vector迭代器失效与深浅拷贝问题 文章目录vector迭代器失效与深浅拷贝问题一、vector迭代器失效问题1. insert迭代器失效1.1.扩容导致野指针1.2.迭代器指向位置意义改变1.3.windows下VS中标准库和Linux下g中标准库对insert迭代器失效的处理2. erase迭代器失效2.1.迭代器失效指向…

UniMSE(2022)统一的多模态情感分析与情感识别(多层融合和对比学习)

论文题目&#xff08;Title&#xff09;&#xff1a;UniMSE: Towards Unified Multimodal Sentiment Analysis and Emotion Recognition 研究问题&#xff08;Question&#xff09;&#xff1a;短情绪emotions和长情绪sentiments的分析和识别 研究动机&#xff08;Motivation…

JAVA之 Maven进阶 分模块开发与设计 依赖管理 聚合 继承 属性 多环境配置与应用 私服

分模块开发意义 我们先创建一个模块并设计相应的内容&#xff0c;pom文件中会有该模块的信息 然后运用maven的install运行&#xff0c;下载该模块的jar到本地仓库 然后需要用到该模块的时候 我们在另一个模块的pom中导入创建的模块坐标就可以了 依赖管理 依赖具有传递性 直…

北京智汇云舟科技数字孪生三大创新应用场景

目前&#xff0c;数字孪生技术正在通过各种行业以无数不同的方式被使用&#xff0c;以产生一些惊人的效果。世界各地不同行业的公司正在采用数字孪生系统来改进从流程到供应链管理、从设施管理到满足能源和可持续发展目标的方方面面。今天我们将重点从轨道交通、学校、能源水利…

NeurIPS 2022-10大主题、50篇论文总结

2672篇主要论文&#xff0c;63场研讨会&#xff0c;7场受邀演讲&#xff0c;包括语言模型、脑启发研究、扩散模型、图神经网络……NeurIPS包含了世界级的AI研究见解&#xff0c;本文将对NeurIPS 2022做一个全面的总结。 第36届Neural Information Processing Systems Conferenc…

“美亚杯”第二届中国电子数据取证大赛答案解析(团体赛)

1. 根据所提供的文件&#xff0c;在映像文件的采集过程中&#xff0c;曾使用那一种的写入保护设备&#xff1f; A&#xff09;软件写入保护设备 B&#xff09;WiebeTech写入保护设备 C&#xff09;EPOS写入保护器 D&#xff09;Tableau取证工具SATA / IDE Bridge IEEE 1394…