WinForm 分屏 [ WinForm | Panel | 视频监控分屏 ]

简介:

前言
      视频监控的分屏技术实际上就是通过动态Panel + 动态指定其Location和Size来实现的,还需要一个计算分屏数目的算法,本文将弥补视频监控系列中动态分屏的功能,权当续文吧 : )

正文
      1.      先“上菜”再讲做法:——上图~~
 

 

 

 

 2.      动态Panel
 

         ///   <summary>
        
///  动态创建面板
         
///   </summary>
        
///   <param name="xy"> Panel的XY坐标 </param>
        
///   <param name="wh"> Panel的大小 </param>
         private  Panel CreatePanel(Point xy, Size wh)
        {
            Panel panel 
=   new  Panel();
            panel.BackColor 
=  System.Drawing.Color.Transparent;
            panel.BackgroundImageLayout 
=  System.Windows.Forms.ImageLayout.Stretch;
            panel.Location 
=  xy;
            panel.Name 
=   string .Concat( " pVideo " );
            panel.Size 
=  wh;
            panel.TabIndex 
=   0 ;
            panel.BackColor 
=  Color.Black;
            
return  panel;
        }

      3.      分屏算法
 

         ///   <summary>
        
///  根据通道数动态计算Panel的坐标和大小
        
///   </summary>
        
///   <param name="channelCount"> 通道数 </param>
        
///   <param name="xy"> 返回运算后每个Panel的坐标 </param>
        
///   <param name="wh"> 返回运算后每个Panel的大小 </param>
         private   void  MathDynamicPanel( int  channelCount,  out  Point[] xy,  out  Size[] wh)
        {
            xy 
=   new  Point[channelCount];
            wh 
=   new  Size[channelCount];

            
// 第一个Panel的起始坐标——不变
            xy[ 0 =   new  Point( 2 38 );

            
// 模数
             int  modulo;

            
if  (channelCount  <=   4 )
                modulo 
=   2 ;
            
else   if  (channelCount  <=   9 )
                modulo 
=   3 ;
            
else   if  (channelCount  <=   16 )
                modulo 
=   4 ;
            
else   if  (channelCount  <=   25 )
                modulo 
=   5 ;
            
else   if  (channelCount  <=   36 )
                modulo 
=   6 ;
            
else   if  (channelCount  <=   49 )
                modulo 
=   7 ;
            
else //  if (channelCount <= 64)
                modulo  =   8 ;

            
int  width, height;
            
// 610 为整个预览区的宽
            width  =  ( 610   -  modulo  *   1 /  modulo;
            
// 532 为整个预览区的高
            height  =  ( 532   -  modulo  *   1 /  modulo;

            
for  ( int  i  =   0 ; i  <  channelCount; i ++ )
            {
                wh[i] 
=   new  Size(width, height);
                
if  (i  >   0 )
                {
                    
// 同一行的Y坐标相等
                    
// 同一列的X坐标相等
                     if  (i  %  modulo  ==   0 )
                        xy[i] 
=   new  Point(xy[i  -  modulo].X, xy[i  -  modulo].Y  +  height  +   1 );
                    
else
                        xy[i] 
=   new  Point(xy[i  -   1 ].X  +  width  +   1 , xy[i  -   1 ].Y);
                }
            }
        }

            代码说明:
                  a).      采用平方算法,即4个头4个Panel(2 ^ 2),8个头9个Panel(3 ^ 3),算是比较简单也满足基本需求的算法了。
                  b).      注意需要固定左上角顶点坐标和总面积,即(2,38)和610,532,这个可以根据自己的时间情况加以修改,可以定义成const int 就行。
                  c).      注意里面算坐标的时候有+1,这个是Panel之间的间隙。
      4.      使用例子
        在Form_Load中加入如下代码:
 

            Point[] xy;
            Size[] wh;
            
int  channel  =   8 ;
            
// 计算面板坐标
            MathDynamicPanel(channel,  out  xy,  out  wh);
            
// 创建面板
             for  ( int  i  =   0 ; i  <  channel; i ++ )
            {
                
this .Controls.Add(CreatePanel(xy[i], wh[i]));
            }

            运行即可见到截图中的样子,最大支持64个屏幕,满足基本需求,自己加上放大、缩小和全屏的代码功能就比较完整了。

 

  5.文章更新维护

    5.1  2010-5-22  修改一下方法,更加好用点

         ///   <summary>
        
///  计算视频面板位置和面积
        
///   </summary>
        
///   <param name="channelCount"></param>
        
///   <param name="TotalSquare"> 总面积和坐标 </param>
        
///   <returns></returns>
         private  IList < Rectangle >  CalcPanelRectangle( int  channelCount, Size TotalArea)
        {
            IList
< Rectangle >  result  =   new  List < Rectangle > ();

            
// 模数
             int  modulo;
            
if  (channelCount  <=   4 )
                modulo 
=   2 ;
            
else   if  (channelCount  >   64 )
                modulo 
=   8 ;
            
else
                modulo 
=  ( int )Math.Ceiling(Math.Sqrt(channelCount));          // 平方根

            
int  width, height;

            
// 单个画面大小
            width  =  (TotalArea.Width  -  modulo  *   1 /  modulo;
            height 
=  (TotalArea.Height  -  modulo  *   1 /  modulo;

            
for  ( int  i  =   0 ; i  <  channelCount; i ++ )
            {
                Rectangle rect 
=   new  Rectangle();
                rect.Width 
=  width;
                rect.Height 
=  height;
                
if  (i  %  modulo  ==   0 )
                {
                    rect.X 
=   1 ;
                    
if  (i  ==   0 )
                        rect.Y 
=   1 ;
                    
else
                        rect.Y 
=  result[i  -  modulo].Y  +  height  +   1 ;
                }
                
else
                {
                    rect.X 
=  result[i  -   1 ].X  +  width  +   1 ;
                    rect.Y 
=  result[i  -   1 ].Y;
                }
                result.Add(rect);
            }
            
return  result;
        }


本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586624,如需转载请自行联系原作者
相关文章
|
数据采集 监控 网络协议
linux系统中利用QT实现视频监控的基本方法
linux系统中利用QT实现视频监控的基本方法
880 0
|
监控 定位技术 安全
Qt编写安防视频监控系统10-视频轮询
一、前言 视频轮询在视频监控系统中是一个基础的核心功能,尤其是上了大屏以后,这个功能是必须的,根据预先设定的轮询间隔逐个加载视频到预先设定的通道画面数中,轮询间隔、轮询画面数、轮询采用的码流类型(主码流、子码流)都可以在系统设置中进行统一设置,轮询的视频源采用摄像机表中的所有摄像机,当画面数不够的时候,其余留空显示即可,轮询到最后一个视频,重新从第一个开始轮询。
2125 0
|
机器学习/深度学习 人工智能 Kubernetes
开源AI驱动的商业综合体保洁管理——智能视频分析系统的技术解析
智能保洁管理系统通过计算机视觉与深度学习技术,解决传统保洁模式中监管难、效率低的问题。系统涵盖垃圾滞留监测、地面清洁度评估、设施表面检测等功能,实现高精度(96%以上)、实时响应(&lt;200毫秒)。基于开源TensorFlow与Kubernetes架构,支持灵活部署与定制开发,适用于商场、机场等场景,提升管理效率40%以上。未来可扩展至气味监测等领域,推动保洁管理智能化升级。
590 26
|
传感器 人工智能 边缘计算
AI赋能油田巡检——无人机视频监控系统的技术解析
无人机油田巡检系统融合无人机硬件与AI视频监控技术,实现全域覆盖、智能分析和高效管理。通过多旋翼/固定翼无人机搭载高分辨率摄像头及传感器,采集多维数据;结合YOLOv9等算法进行异常检测,准确率高达98%。系统支持5G实时传输、边缘计算及集中化管理平台,提供可视化监控与预测性维护。基于开源框架设计,灵活扩展且成本低,大幅提升油田巡检效率与安全性。
1274 0
|
机器学习/深度学习 传感器 人工智能
AI视频监控系统在养老院中的技术实现
AI视频监控系统在养老院的应用,结合了计算机视觉、深度学习和传感器融合技术,实现了对老人体征、摔倒和异常行为的实时监控与分析。系统通过高清摄像头和算法模型,能够准确识别老人的动作和健康状况,并及时向护理人员发出警报,提高护理质量和安全性。
1177 14
|
机器学习/深度学习 传感器 人工智能
开源AI视频监控系统在监狱安全中的应用——实时情绪与行为分析、暴力预警技术详解
针对监狱环境中囚犯情绪波动和复杂人际互动带来的监控挑战,传统CCTV系统难以有效预警暴力事件。AI视频监控系统基于深度学习与计算机视觉技术,实现对行为、情绪的实时分析,尤其在低光环境下表现优异。该系统通过多设备协同、数据同步及自适应训练,确保高精度识别(95%以上)、快速响应(&lt;5秒),并具备24小时不间断运行能力,极大提升了监狱安全管理的效率与准确性。
1450 1
|
存储 监控 安全
【亮剑】指导初学者如何搭建和使用网络视频监控系统。
【4月更文挑战第30天】本文指导初学者如何搭建和使用网络视频监控系统。核心设备包括摄像头(如固定、PTZ、多目、夜视)、存储选项(NVR、DVR、云存储)及网络交换机等。安装配置步骤涉及规划布局、安装摄像头、设置存储设备和软件配置。实时监控包括实时查看、接收警报和录像回放。理解设备功能、合理布局并细心操作,就能建立稳定监控体系。随着技术进步,未来监控系统将更智能、高效,保障安全。
2192 0
|
编解码 监控 物联网
【学员源鑫笔记】韦东山物联网流媒体实战项目-智慧家居视频监控系统(值得收藏)
【学员源鑫笔记】韦东山物联网流媒体实战项目-智慧家居视频监控系统(值得收藏)
1206 0
|
存储 监控 前端开发
Net5开发的视频监控管理系统
一个基于.Net 5构建的简单、跨平台视频监控系统,代码清晰简洁、易扩展,采用前后端分离架构。
1006 0
Net5开发的视频监控管理系统

热门文章

最新文章