案例分享: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月前
|
存储 运维 数据挖掘
服务器数据恢复—EqualLogic存储硬盘出现坏道的数据恢复案例
某品牌EqualLogic PS6100存储阵列上有一组由16块硬盘组建的raid5磁盘阵列。磁盘阵列上层划分多个大小不同的卷,存放虚拟机文件。 硬盘出现故障导致存储阵列不可用,需要恢复存储阵列中的数据。
|
2月前
|
存储 运维 Oracle
服务器数据恢复—存储硬盘指示灯亮黄灯,RAID5阵列崩溃的数据恢复案例
服务器存储数据恢复环境: 某单位一台某品牌DS5300存储,1个机头+4个扩展柜,50块的硬盘组建了两组RAID5阵列。一组raid5阵列有27块硬盘,存放Oracle数据库文件。存储系统上层一共划分了11个卷。 服务器存储故障: 存储设备上两个硬盘指示灯亮黄色。其中一组RAID5阵列崩溃,存储不可用,设备已经过保。
|
3月前
|
Unix 应用服务中间件 索引
服务器数据恢复—LUN映射出错导致文件系统共享冲突的数据恢复案例
SUN光纤存储系统中有一组由6个硬盘组建的RAID6,划分为若干LUN,MAP到跑不同业务的服务器上,这些服务器上运行的是SOLARIS操作系统。 服务器不存在物理故障。由于公司业务变化,需要增加一台服务器跑新的应用。服务器管理员在原服务器在线的状态下,将其中一个lun映射到一台新服务器上。实际上,这个刚映射过去的卷已经map到了solaris生产系统上的某个lun上了。映射到新服务器后,服务器对这个卷进行初始化的操作,原solaris系统上的磁盘报错,重启服务器后这个卷已经无法挂载。 服务器管理员寻求sun原厂工程师的帮助。sun工程师检测后执行了fsck操作。执行完成后文件系统挂载成功。查
|
3月前
|
存储 数据挖掘 Linux
服务器数据恢复—重装系统导致OceanStor存储上的分区无法访问的数据恢复案例
服务器存储数据恢复环境: 华为OceanStor某型号存储+扩展盘柜,存储中的硬盘组建了raid5磁盘阵列,上层分配了1个lun。 linux操作系统,划分了两个分区,分区一通过lvm扩容,分区二为xfs文件系统。 服务器存储故障: 工作人员重装系统操作失误导致磁盘分区变化,分区二无法访问,数据丢失。
|
3月前
|
存储 数据挖掘 Windows
服务器数据恢复—RAIDZ上层ZFS文件系统数据恢复案例
一台服务器有32块硬盘,采用Windows操作系统。 服务器在正常运行的时候突然变得不可用。没有异常断电、进水、异常操作、机房不稳定等外部因素。服务器管理员重启服务器,但是服务器无法进入系统。管理员联系北亚企安数据恢复工程师要求恢复服务器数据。
|
4月前
|
存储 算法 数据挖掘
服务器数据恢复—昆腾存储StorNext文件系统数据恢复案例
一台昆腾存储设备中有一组raid5磁盘阵列。阵列上有两块硬盘先后离线,raid5磁盘阵列不可用。
|
3月前
|
存储
服务器数据恢复—服务器断电导致数据丢失的数据恢复案例
某品牌服务器中有12块硬盘,组建了一组raid5磁盘阵列,服务器内存储的是普通文件。 机房供电不稳定导致服务器断电,管理员重启服务器后发现服务器无法正常工作。 根据描述的故障发生过程,北亚企安数据恢复工程师推断故障是意外断电导致raid模块损坏。
|
4月前
|
小程序 数据挖掘
服务器数据恢复—服务器上的卷被误删除的数据恢复案例
工作人员不慎将一台服务器上的卷误删除,服务器上有一组raid5阵列。需要恢复误删除的数据。
|
4月前
|
存储 运维 Oracle
服务器数据恢复—服务器存储硬盘指示灯亮黄灯的数据恢复案例
某单位的一台某品牌存储设备,该系统由1个机头+4个扩展柜组成,一共有50块硬盘组建了两组RAID5阵列。上层划分了11个卷。 一组RAID崩溃,该组RAID由27块硬盘组建,存放的是Oracle数据库文件。 服务器不可用,已经过保。
|
5月前
|
Oracle 安全 数据挖掘
服务器数据恢复—RAID硬盘离线导致卷无法挂载的数据恢复案例
服务器数据恢复环境&故障: 某公司一台服务器上有一组由24块FC硬盘组建的raid。 服务器出现故障,无法正常工作。 经过初步检测,管理员发现导致服务器故障的原因是raid中有两块硬盘掉线,导致卷无法挂载。

热门文章

最新文章

推荐镜像

更多
  • qt