Qt开源作品15-视频监控画面
一、前言
视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅猛,人脸识别相关的技术和应用这几年处于风口浪尖,衍生了特别多的应用产品,各种人脸识别的产品遍地开花,刷脸门禁,车站机场人脸识别,刷脸取票等,但是其实大部分内行人士可能都比较绝望,外行感觉像看科幻片一样,老板们各种打鸡血,今天几个亿明天几个亿。
纵观Qt的应用场景领域,在国内,基本上在安防、航天船舶、教育、工业控制领域,占有比较大的比例,其实个人非常喜爱Qt的,从没见过如此完美的API封装,包括命名,最牛逼的就是跨平台特性,可以说完爆.NET的跨平台,甚至连那种几十兆的嵌入式linux版本都能运行,这就使得成本大大降低,提高了产品的丰富性。自从用了Qt以后,就再也不想用VC/VB/C#等。
视频监控画面在任何视频监控系统中是少不了的一个功能,基本上是需要1画面、4画面、6画面、8画面、9画面、16画面等,Qt提供的表格布局非常胜任这个工作,网上几乎没有看到qt做的最基础的视频监控画面分割的demo,今天特意花几分钟提取出来,开源放出来。欢迎大家多多点赞!现在还增加了25画面、36画面,里边的函数封装的很好,稍微加几行可以直接增加49画面等其他的。
二、代码思路
void VideoPanel::change_video(int index, int flag)
{
int count = 0;
int row = 0;
int column = 0;
for (int i = 0; i < videoCount; i++) {
if (i >= index) {
gridLayout->addWidget(widgets.at(i), row, column);
widgets.at(i)->setVisible(true);
count++;
column++;
if (column == flag) {
row++;
column = 0;
}
}
if (count == (flag * flag)) {
break;
}
}
}
void VideoPanel::change_video_4(int index)
{
hide_video_all();
change_video(index, 2);
}
void VideoPanel::change_video_6(int index)
{
hide_video_all();
if (index == 0) {
gridLayout->addWidget(widgets.at(0), 0, 0, 2, 2);
gridLayout->addWidget(widgets.at(1), 0, 2, 1, 1);
gridLayout->addWidget(widgets.at(2), 1, 2, 1, 1);
gridLayout->addWidget(widgets.at(3), 2, 2, 1, 1);
gridLayout->addWidget(widgets.at(4), 2, 1, 1, 1);
gridLayout->addWidget(widgets.at(5), 2, 0, 1, 1);
for (int i = 0; i < 6; i++) {
widgets.at(i)->setVisible(true);
}
} else if (index == 5) {
gridLayout->addWidget(widgets.at(5), 0, 0, 2, 2);
gridLayout->addWidget(widgets.at(6), 0, 2, 1, 1);
gridLayout->addWidget(widgets.at(7), 1, 2, 1, 1);
gridLayout->addWidget(widgets.at(8), 2, 2, 1, 1);
gridLayout->addWidget(widgets.at(9), 2, 1, 1, 1);
gridLayout->addWidget(widgets.at(10), 2, 0, 1, 1);
for (int i = 5; i < 11; i++) {
widgets.at(i)->setVisible(true);
}
} else if (index == 10) {
gridLayout->addWidget(widgets.at(10), 0, 0, 2, 2);
gridLayout->addWidget(widgets.at(11), 0, 2, 1, 1);
gridLayout->addWidget(widgets.at(12), 1, 2, 1, 1);
gridLayout->addWidget(widgets.at(13), 2, 2, 1, 1);
gridLayout->addWidget(widgets.at(14), 2, 1, 1, 1);
gridLayout->addWidget(widgets.at(15), 2, 0, 1, 1);
for (int i = 10; i < 16; i++) {
widgets.at(i)->setVisible(true);
}
}
}
void VideoPanel::change_video_8(int index)
{
hide_video_all();
if (index == 0) {
gridLayout->addWidget(widgets.at(0), 0, 0, 3, 3);
gridLayout->addWidget(widgets.at(1), 0, 3, 1, 1);
gridLayout->addWidget(widgets.at(2), 1, 3, 1, 1);
gridLayout->addWidget(widgets.at(3), 2, 3, 1, 1);
gridLayout->addWidget(widgets.at(4), 3, 3, 1, 1);
gridLayout->addWidget(widgets.at(5), 3, 2, 1, 1);
gridLayout->addWidget(widgets.at(6), 3, 1, 1, 1);
gridLayout->addWidget(widgets.at(7), 3, 0, 1, 1);
for (int i = 0; i < 8; i++) {
widgets.at(i)->setVisible(true);
}
} else if (index == 8) {
gridLayout->addWidget(widgets.at(8), 0, 0, 3, 3);
gridLayout->addWidget(widgets.at(9), 0, 3, 1, 1);
gridLayout->addWidget(widgets.at(10), 1, 3, 1, 1);
gridLayout->addWidget(widgets.at(11), 2, 3, 1, 1);
gridLayout->addWidget(widgets.at(12), 3, 3, 1, 1);
gridLayout->addWidget(widgets.at(13), 3, 2, 1, 1);
gridLayout->addWidget(widgets.at(14), 3, 1, 1, 1);
gridLayout->addWidget(widgets.at(15), 3, 0, 1, 1);
for (int i = 8; i < 16; i++) {
widgets.at(i)->setVisible(true);
}
}
}
void VideoPanel::change_video_9(int index)
{
hide_video_all();
change_video(index, 3);
}
void VideoPanel::change_video_13(int index)
{
hide_video_all();
if (index == 0) {
gridLayout->addWidget(widgets.at(0), 0, 0, 1, 1);
gridLayout->addWidget(widgets.at(1), 0, 1, 1, 1);
gridLayout->addWidget(widgets.at(2), 0, 2, 1, 1);
gridLayout->addWidget(widgets.at(3), 0, 3, 1, 1);
gridLayout->addWidget(widgets.at(4), 1, 0, 1, 1);
gridLayout->addWidget(widgets.at(5), 2, 0, 1, 1);
gridLayout->addWidget(widgets.at(6), 1, 1, 2, 2);
gridLayout->addWidget(widgets.at(7), 1, 3, 1, 1);
gridLayout->addWidget(widgets.at(8), 2, 3, 1, 1);
gridLayout->addWidget(widgets.at(9), 3, 0, 1, 1);
gridLayout->addWidget(widgets.at(10), 3, 1, 1, 1);
gridLayout->addWidget(widgets.at(11), 3, 2, 1, 1);
gridLayout->addWidget(widgets.at(12), 3, 3, 1, 1);
for (int i = 0; i < 13; i++) {
widgets.at(i)->setVisible(true);
}
} else if (index == 3) {
gridLayout->addWidget(widgets.at(3), 0, 0, 1, 1);
gridLayout->addWidget(widgets.at(4), 0, 1, 1, 1);
gridLayout->addWidget(widgets.at(5), 0, 2, 1, 1);
gridLayout->addWidget(widgets.at(6), 0, 3, 1, 1);
gridLayout->addWidget(widgets.at(7), 1, 0, 1, 1);
gridLayout->addWidget(widgets.at(8), 2, 0, 1, 1);
gridLayout->addWidget(widgets.at(9), 1, 1, 2, 2);
gridLayout->addWidget(widgets.at(10), 1, 3, 1, 1);
gridLayout->addWidget(widgets.at(11), 2, 3, 1, 1);
gridLayout->addWidget(widgets.at(12), 3, 0, 1, 1);
gridLayout->addWidget(widgets.at(13), 3, 1, 1, 1);
gridLayout->addWidget(widgets.at(14), 3, 2, 1, 1);
gridLayout->addWidget(widgets.at(15), 3, 3, 1, 1);
for (int i = 3; i < 16; i++) {
widgets.at(i)->setVisible(true);
}
}
}
void VideoPanel::change_video_16(int index)
{
hide_video_all();
change_video(index, 4);
}
void VideoPanel::change_video_25(int index)
{
hide_video_all();
change_video(index, 5);
}
void VideoPanel::change_video_36(int index)
{
hide_video_all();
change_video(index, 6);
}
void VideoPanel::change_video_64(int index)
{
hide_video_all();
change_video(index, 8);
}
三、效果图

四、开源主页
- 以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。
- 本开源项目已经成功升级到V2.0版本,分门别类,图文并茂,保你爽到爆。
- Qt开源武林秘籍开发经验,看完学完,20K起薪,没有找我!
- 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
- 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
- 开源秘籍:https://gitee.com/feiyangqingyun/qtkaifajingyan
- 个人主页:https://qtchina.blog.csdn.net/
- 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
Qt开源作品15-视频监控画面的更多相关文章
- Qt编写视频监控画面分割界面(开源)
其实qt应用在安防领域还是蛮多的,尤其是视频监控系统,但是网上几乎没有看到qt做的最基础的视频监控画面分割的demo,今天特意花几分钟提取出来,开源放出来.欢迎大家多多点赞!源码下载:点击打开链接 运 ...
- Qt编写安防视频监控系统(界面很漂亮)
一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...
- Qt编写安防视频监控系统18-云台控制
一.前言 云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂 ...
- Qt编写安防视频监控系统12-异形布局
一.前言 视频监控系统中,除了常规的1画面.4画面.9画面.16画面以外,还有几个布局比较另类,比如6画面.8画面.13画面,有些通道需要占据不同的行列,4画面.9画面.16画面都是非常对称的布局,行 ...
- Qt编写安防视频监控系统5-视频回放
一.前言 一般视频回放都会采用GB28181国标来处理,这样可以保证兼容国内各大厂家的NVR,毕竟在同一的国家标准下,大家都会统一支持国标的,就不需要根据各个厂家的SDK来做兼容处理,烦得很,厂家越来 ...
- Qt编写安防视频监控系统1-通道切换
一.前言 通道切换在视频监控系统中是最基础的必备功能,一般都会提供1通道+4通道+6通道+8通道+9通道+16通道这几个通道切换,可能做得比较好的还会提供24通道+32通道的,这个可能对电脑的配置就有 ...
- Qt编写安防视频监控系统15-远程回放
一.前言 远程回放有两种处理方式,一种是采用NVR厂家提供的SDK开发包来登录到NVR上,然后根据SDK的函数接口指定的视频文件,当然也有接口查询视频文件列表等:一种是采用视频监控行业的国标GB281 ...
- Qt编写安防视频监控系统13-视频存储
一.前言 一般视频监控行业都会选择把视频存储在本地NVR或者服务器上,而不是存储在客户端电脑,只有当用户经费预算有限的时候,或者用户特殊需求要求存储在本地客户端电脑的时候才会开启存储到本地,正常来说视 ...
- Qt编写安防视频监控系统11-动态换肤
一.前言 Qt中的动态换肤技术是非常一流的,直接调用qApp->setStyleSheet(qss);就可以对整个应用程序进行换肤,如果样式表内容不多,或者对应的贴图不对,效率还是蛮好的,不过据 ...
- Qt编写安防视频监控系统9-自动隐藏光标
一.前言 这个效果的灵感来自于大屏电子看板系统,在很多系统中尤其是上了大屏的时候,其实在用户不在操作的时候,是很不希望看到那个鼠标箭头指针的,只有当用户操作的时候才显示出来,这个就需要开个定时器定时计 ...
随机推荐
- 0403-Tensor内部存储结构
0403-Tensor内部存储结构 目录 一.Tensor内部存储结构 pytorch完整教程目录:https://www.cnblogs.com/nickchen121/p/14662511.htm ...
- KubeSphere 社区双周报 | 2023.12.21-2024.01.04
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- 云原生周刊:Grafana Beyla 发布 | 2023.9.18
开源项目推荐 Komiser Komiser 是一个与云无关的开源资源管理器.它与多个云提供商(包括 AWS.Azure.Civo.Digital Ocean.OCI.Linode.腾讯和 Scale ...
- sqluldr2linux64.bin命令行下的Oracle数据导出工具
sqluldr2.bin是Oracle数据库下,数据导出的工具 (1)query导出 ./sqluldr2.bin user=用户/密码@主机IP/数据库名 query="select ...
- 生成文本聚类java实现3
由于carrot2对中文的理解很不靠谱,所以参考了网络上的一些资料,现在贡献出来所有代码. 代码的思路就是找字或者词出现的频度,并进行打分,最后按照出现次数和重要性,找出重要的语汇.现在贴出来一些可用 ...
- 从 Git 提交历史生成 Release Note
发布软件时写 Release Note 算是常规操作,但每次从头手打也有点累,可以考虑从 Git 的提交历史中自动生成. Git 提交信息一般是三段式结构,段落之间使用空行隔开: <subjec ...
- 使用最小二乘法进行线性回归(Python)
已知测得某块地,当温度处于15至40度之间时,数得某块草地上小花朵的数量和温度值的数据如下表所示.现在要来找出这些数据中蕴含的规律,用来预测其它未测温度时的小花朵的数量. 测得数据如下图所示: imp ...
- MySQL原理简介—2.InnoDB架构原理和执行流程
大纲 1.更新语句在MySQL中是如何执行的 2.重要的内存结构-Buffer Pool缓冲池 3.undo日志文件如何让更新的数据可以回滚 4.更新Buffer Pool缓冲池中的缓存数据 5.Re ...
- paramiko模块的使用
简介: Paramiko是基于Python(2.7,3.4+)版本实现和封装了SSHv2协议,底层是用cryptography实现,我们如果希望远程登录主机或者远程下载或者上传文件到远程主机都可以使用 ...
- Java深度历险(三)——Java线程:基本概念、可见性与同步
开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于J ...