案例分享:Qt的80路显示超大屏幕拼接(十台服务器,每台八路摄像头)方案和Demo

简介: 案例分享:Qt的80路显示超大屏幕拼接(十台服务器,每台八路摄像头)方案和Demo

若该文为原创文章,转载请注明原文出处

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79577035

各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

合作案例专栏:案例分享(体验Demo可下载,只定制)

 

需求

       有10台服务器,每台8路摄像头,8路拼接处理后单个服务器输出8*1920*1080的图片数据,每台服务器输出各自的八路,实现缩放拽拖等。

 

ReadMe

 

最终采用的方案

       步骤一:客户端获取每个服务器在本地的实际rect(每个服务器在本地的原始图片拼接范围);

       步骤二:依据缩放比例系数和鼠标的位置计算出rectVirtual(按照指定点缩小放大后的图片拼接范围);

       步骤三:每个服务器所处的rectVirtual与实际显示的窗口rect()取交集,更新的每个服务器显示的范围;

       步骤四:分别组装获取指令(一个线程负责一个块区域),

                    将获取指令(x,y,width,height,scale)发送(Json);

       步骤五:接收更新显示范围后的协议数据;

       步骤六:解析协议获取rgb888数据:总长度(包括总长度4字节)(4字节)+ 图像宽度(2字节)+ 图像原始高度(2字节)+ 显示宽度(2字节) + 显示高度(2字节) + 图像数据(n字节);

       步骤七:使用服务器获取的显示数据刷新对应的显示区域,重复步骤二。

       注意:软件模拟时间主要耗在服务器对图像的变换,使用本地硬解码或者库之后(直接调库)或者从服务器获取,其时间达到20ms左右,可达到理想效果。

 

Demo

       下载地址:https://download.csdn.net/download/qq21497936/10289809

 

演示图

 

客户端关键代码(ImageWidget控件)

imagewidget.h

#ifndef IMAGEWIDGET_H
#define IMAGEWIDGET_H
#include <QWidget>
#include <QThread>
#include <QRectF>
#include "tcpclient.h"
#include <QElapsedTimer>
/************************************************************\
 * 类名:ImageWidget
 * 描述:1-10路固定19200*1080图像拼接
 * 使用:
 *      1.构建一个ImageWidget类
 *      2.设置主机地址setHostAddreess,填入一一对应的服务器ip地址list和port端口list
 *      3.调用start
 * 函数:
 *      isRunning() - 是否在运行
 *      setHostAddreess() - 设置服务器地址,如:127.0.0.1:20001,127.0.0.1:20002,则传入QList("127.0.0.1","127.0.01"),QList(20001,20002)
 *      start() - 开启运行
 *      stop() - 停止运行
 * 作者:红模仿    QQ:21497936
 *   版本         日期             描述
 *   v1.0    2018年3月12日       已优化
\************************************************************/
namespace Ui {
class ImageWidget;
}
class ImageWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ImageWidget(QWidget *parent = 0);
    ~ImageWidget();
    bool isRunning();
signals:
    void signalfinished();
public slots:
    void start();
    void stop();
    void setHostAddreess(QList<QString> listIp, QList<quint16> listPort);
    void init();
protected slots:
    void recvOneImage(int index, QByteArray& data, int fullWidth, int fullHeight, int width, int height, int time);
protected:
    void paintEvent(QPaintEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;
private slots:
    void finished();
private:
    Ui::ImageWidget *ui;
    QList<TcpClient *> _listTcpClient;
    QList<QThread *> _listTcpClientThread;
    bool _ok;
    QPoint _pointLast;
    double _add_scale_step;
    double _dec_scale_step;
    double _scale;
    QList<QRectF> _listRectRangeFullImage;         // 图片的实际尺寸
    QList<QRectF> _listRectRangeFullImageVirtual;  // 虚拟显示框框
    QList<QRectF> _listRectRangeGetImage;          // 图像数据
    QList<QRectF> _listRectRangeImageOldShow;      // 旧区域
    QList<QRectF> _listRectRangeImageShow;         // 正常情况下的需要显示的部分
    QList<QPixmap *> _listPixmap;
    bool _initRectRangeFullImageVirtual;
    QElapsedTimer _time;
    int _serverNumber;
    QList<QString> _listIp;
    QList<quint16> _listPort;
    QElapsedTimer _timerInverval;
};
#endif // IMAGEWIDGET_H

服务器代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QImage>
#include <QTcpServer>
#include <QTcpSocket>
#include <QByteArray>
#define SCALE_BASE (1000)
class QPaintEvent;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected slots:
    void newConnection();
    void readyRead();
    void doImage(int x, int y, int width, int height, double scale);
    void doImage(int x, int y, int width, int height, int vx, int vy, int vWidth, int vHeight);
protected:
    void paintEvent(QPaintEvent *event) override;
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
    QImage _image;
    QTcpServer *_pTcpServer;
    QTcpSocket * _pTcpSocket;
    QByteArray _byteArrayJpg;
};
#endif // MAINWINDOW_H

 

若该文为原创文章,转载请注明原文出处

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79577035


相关文章
|
2月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
27天前
|
存储 数据挖掘 Linux
服务器数据恢复—重装系统导致OceanStor存储上的分区无法访问的数据恢复案例
服务器存储数据恢复环境: 华为OceanStor某型号存储+扩展盘柜,存储中的硬盘组建了raid5磁盘阵列,上层分配了1个lun。 linux操作系统,划分了两个分区,分区一通过lvm扩容,分区二为xfs文件系统。 服务器存储故障: 工作人员重装系统操作失误导致磁盘分区变化,分区二无法访问,数据丢失。
|
11天前
|
存储 数据挖掘 Windows
服务器数据恢复—RAIDZ上层ZFS文件系统数据恢复案例
一台服务器有32块硬盘,采用Windows操作系统。 服务器在正常运行的时候突然变得不可用。没有异常断电、进水、异常操作、机房不稳定等外部因素。服务器管理员重启服务器,但是服务器无法进入系统。管理员联系北亚企安数据恢复工程师要求恢复服务器数据。
|
1月前
|
存储 算法 数据挖掘
服务器数据恢复—昆腾存储StorNext文件系统数据恢复案例
一台昆腾存储设备中有一组raid5磁盘阵列。阵列上有两块硬盘先后离线,raid5磁盘阵列不可用。
|
25天前
|
存储
服务器数据恢复—服务器断电导致数据丢失的数据恢复案例
某品牌服务器中有12块硬盘,组建了一组raid5磁盘阵列,服务器内存储的是普通文件。 机房供电不稳定导致服务器断电,管理员重启服务器后发现服务器无法正常工作。 根据描述的故障发生过程,北亚企安数据恢复工程师推断故障是意外断电导致raid模块损坏。
|
1月前
|
小程序 数据挖掘
服务器数据恢复—服务器上的卷被误删除的数据恢复案例
工作人员不慎将一台服务器上的卷误删除,服务器上有一组raid5阵列。需要恢复误删除的数据。
|
1月前
|
存储 运维 Oracle
服务器数据恢复—服务器存储硬盘指示灯亮黄灯的数据恢复案例
某单位的一台某品牌存储设备,该系统由1个机头+4个扩展柜组成,一共有50块硬盘组建了两组RAID5阵列。上层划分了11个卷。 一组RAID崩溃,该组RAID由27块硬盘组建,存放的是Oracle数据库文件。 服务器不可用,已经过保。
|
2月前
|
Oracle 安全 数据挖掘
服务器数据恢复—RAID硬盘离线导致卷无法挂载的数据恢复案例
服务器数据恢复环境&故障: 某公司一台服务器上有一组由24块FC硬盘组建的raid。 服务器出现故障,无法正常工作。 经过初步检测,管理员发现导致服务器故障的原因是raid中有两块硬盘掉线,导致卷无法挂载。
|
2月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—服务器异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。 Oracle数据库恢复流程: 1、检测数据库故障情况; 2、尝试挂起并修复数据库; 3、解析数据库文件; 4、导出并验证恢复的数据库文件。
|
2月前
|
Oracle 安全 关系型数据库
服务器数据恢复—热备盘未成功激活导致raid崩溃的数据恢复案例
一台服务器中有5块硬盘,其中的4块组建了一组RAID5阵列,剩下一块盘作为热备盘(Hot-Spare)使用。服务器操作系统为linux,应用系统为构架于oracle数据库的一个oa。 raid5阵列中一块盘离线,但热备盘未自动激活rebuild。直到另外一块盘离线,RAID崩溃。 由于oracle已经不再对本案例中的oa系统提供后续支持,用户方要求尽可能恢复数据和操作系统。经过检测发现热备盘完全没有启用,硬盘无明显物理故障,无明显同步表现。

推荐镜像

更多
  • qt