监控

13.4  监  控

在一些银行、大型商场、办公楼、升降电梯中,为了保障公有财产、商品、办公设备、资料、人身等的安全,都设有监控系统。在出现问题时,用户可以通过监控系统查找原因。下面的几个实例分别实现了摄像头监控与定时监控的功能。

实例425 简易视频程序

实例说明

文本框: 图13.9  简易摄像头监控程序利用普通的简易摄像头,通过C#语言即可开发成简易视频程序。本实例利用市场上购买的普通摄像头,利用VFW技术,实现单路视频监控系统。运行程序,窗体中将显示舰体摄像头采集的视频信息。如图13.9所示。

技术要点

本实例主要使用了VFW(Video for Windows)技术。VFW 是Microsoft公司为开发Windows平台下的视频应用程序提供的软件工具包,提供了一系列应用程序编程接口(API),用户可以通过这些接口很方便地实现视频捕获、视频编辑及视频播放等通用功能,还可利用回调函数开发比较复杂的视频应用程序。该技术的特点是播放视频时不需要专用的硬件设备,而且应用灵活,可以满足视频应用程序开发的需要。Windows操作系统自身就携带了VFW技术,系统安装时,会自动安装VFW的相关组件。

VFW技术主要由六个功能模块组成,下面进行简单说明。

l     AVICAP32.DLL:包含执行视频捕获的函数,给AVI文件的I/O处理和视频,音频设备驱动程序提供一个高级接口。

l     MSVIDEO.DLL:包含一套特殊的DrawDib函数,用来处理程序上的视频操作。

l     MCIAVI.DRV:包括对VFW的MCI命令解释器的驱动程序。

l     AVIFILE.DLL:包含由标准多媒体I/O(mmio)函数提供的更高级的命令,用来访问.AVI文件。

l     ICM:压缩管理器,用于管理的视频压缩/解压缩的编译码器。

l     ACM:音频压缩管理器,提供与ICM相似的服务,适用于波形音频。

其中13.4节所有的实例主要使用AVICAP32.DLL中的函数和USER32.DLL中的函数,函数语法及结构如下。

(1)capCreateCaptureWindow函数

该函数用于创建一个视频捕捉窗口。语法如下:

        [DllImport("avicap32.dll")]

        public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);

参数说明如下。

l     lpszWindowName:标识窗口的名称。

l     dwStyle:标识窗口风格。

l     x、y:标识窗口的左上角坐标。

l     nWidth、nHeight:标识窗口的宽度和高度。

l     hWnd:标识父窗口句柄。

l     nID:标识窗口ID。

l     返回值:视频捕捉窗口句柄。

(2)SendMessage函数

用于向Windows系统发送消息机制。

[DllImport("User32.dll")]

private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);

参数说明如下。

l     hWnd:窗口句柄。

l     wMsg:将要发送的消息。

l     wParam、lParam:消息的参数,每个消息都有两个参数,参数设置由发送的消息而定。

实现过程

(1)新建一个项目,命名为Ex13_08,默认窗体为Form1,添加1个类文件(.CS),用于编写视频类。

(2)在Form1窗体中,主要添加1个PictrueBox控件,用于显示视频;添加4个Button控件,用于打开视频、关闭视频、拍摄照片和退出程序。

(3)主要程序代码。

视频类中主要实现打开视频、关闭视频以及通过视频拍摄照片的功能。代码如下:

    public class VideoAPI  //视频API类

    {

        //  视频API调用

        [DllImport("avicap32.dll")]

        public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);

        [DllImport("avicap32.dll")]

        public static extern bool capGetDriverDescriptionA(short wDriver, byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);

        [DllImport("User32.dll")]

        public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);

        [DllImport("User32.dll")]

        public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam);

        //  常量

        public const int WM_USER = 0x400;

        public const int WS_CHILD = 0x40000000;

        public const int WS_VISIBLE = 0x10000000;

        public const int SWP_NOMOVE = 0x2;

        public const int SWP_NOZORDER = 0x4;

        public const int WM_CAP_DRIVER_CONNECT = WM_USER + 10;

        public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + 11;

        public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + 5;

        public const int WM_CAP_SET_PREVIEW = WM_USER + 50;

        public const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;

        public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;

        public const int WM_CAP_START = WM_USER;

        public const int WM_CAP_SAVEDIB = WM_CAP_START + 25;

    }

    public class cVideo     //视频类

    {

        private IntPtr lwndC;       //保存无符号句柄

        private IntPtr mControlPtr; //保存管理指示器

        private int mWidth;

        private int mHeight;

        public cVideo(IntPtr handle, int width, int height)

        {

            mControlPtr = handle; //显示视频控件的句柄

            mWidth = width;      //视频宽度

            mHeight = height;    //视频高度

        }

        /// <summary>

        /// 打开视频设备

        /// </summary>

        public void StartWebCam()

        {

            byte[] lpszName = new byte[100];

            byte[] lpszVer = new byte[100];

            VideoAPI.capGetDriverDescriptionA(0, lpszName, 100, lpszVer, 100);

            this.lwndC = VideoAPI.capCreateCaptureWindowA(lpszName, VideoAPI.WS_CHILD | VideoAPI.WS_VISIBLE, 0, 0, mWidth, mHeight, mControlPtr, 0);

            if (VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_CONNECT, 0, 0))

            {

                VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEWRATE, 100, 0);

                VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEW, true, 0);

            }

        }

        /// <summary>

        /// 关闭视频设备

        /// </summary>

        public void CloseWebcam()

        {

            VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_DISCONNECT, 0, 0);

        }

        ///   <summary>  

        ///   拍照

        ///   </summary>  

        ///   <param   name="path">要保存bmp文件的路径</param>  

        public void GrabImage(IntPtr hWndC, string path)

        {

            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);

            VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SAVEDIB, 0, hBmp.ToInt32());

        } 

    }

Form1窗体中通过调用视频类中的方法来实现相应的功能。

在【打开视频】按钮的Click事件中添加如下代码:

        private void button1_Click(object sender, EventArgs e)

        {

            btnPlay.Enabled = false;

            btnStop.Enabled = true;

            btnPz.Enabled = true;

            video = new cVideo(pictureBox1.Handle, pictureBox1.Width, pictureBox1.Height);

            video.StartWebCam();

        }

在【关闭视频】按钮的Click事件中添加如下代码:

        private void b_stop_Click(object sender, EventArgs e)

        {

            btnPlay.Enabled = true;

            btnStop.Enabled = false;

            btnPz.Enabled = false;

            video.CloseWebcam();

        }

在【拍摄照片】按钮的Click事件下添加如下代码:

        private void btnPz_Click(object sender, EventArgs e)

        {

            video.GrabImage(pictureBox1.Handle, "d://a.bmp");

        }

举一反三

根据本实例,读者可以开发以下程序。

*  无人值班视频实时监控系统。

*  车库安全实时监控系统。

实例426 摄像头监控录像

实例说明

文本框: 图13.10  监控录像本例是为通过摄像头来实现监控录像的程序。运行本例后,单击【开始监控】按钮,程序将自动开始录像,录像文件(lx.avi)将保存在D盘根目录下。运行程序,效果如图13.10所示。

技术要点

在实例“简易视频程序”的技术要点中,使用的技术和相关函数已经介绍过。在这里主要介绍如何将捕获的视频制作成 .AVI媒体文件。实现技术为主要通过SendMessage函数发送Windows消息机制,消息值WM_CAP_FILE_SET_CAPTURE_FILEA和WM_CAP_SEQUENCE,分别用来设置视频捕捉的文件名称和初始化视频流,捕捉视频信息到文件:

        private const int WM_USER = 0x400;

        private const int WM_CAP_START = WM_USER;

        private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;

        private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;

实现关键代码如下:

            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);

            SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0, hBmp.ToInt32());

            SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);

实现过程

(1)新建一个项目,命名为Ex13_09,默认窗体为Form1,添加一个类文件(.CS),用于编写视频类。

(2)在Form1窗体中,主要添加一个PictrueBox控件,用于显示视频;添加4个Button控件,用于开始监控、停止监控和监控程序。

(3)视频类中主要程序代码如下:

        ///   <summary>  

        ///   开始录像

        ///   </summary>  

        ///   <param   name="path">要保存录像的路径</param>  

        public void StarKinescope(string path)

        {

            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);

            SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0, hBmp.ToInt32());

            SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);

        }

        /// <summary>

        /// 停止录像

        /// </summary>

        public void StopKinescope()

        {

            SendMessage(hWndC, WM_CAP_STOP, 0, 0);

        }

(4)Form1窗体中主要程序代码如下:

//开始录像

        private void button1_Click(object sender, EventArgs e)

        {

            btnStar.Enabled = false;

            btnStop.Enabled = true;

            video.StarKinescope(@"d:/lx.avi");

        }

//停止录像

        private void button2_Click(object sender, EventArgs e)

        {

            btnStar.Enabled = true;

            btnStop.Enabled = false;

            video.StopKinescope();

        }

举一反三

根据本实例,读者可以开发以下程序。

*  小区视频监控录像系统。

*  公司财务室视频监控系统。

实例427 超市摄像头定时监控系统

实例说明

本实例实现超市摄像头定时监控系统。运行本例后,在“定时监控设置”处设置监控的星期及时间,单击【保存】按钮,将“定时设置”参数数据保存到数据库中。系统在运行到定时时间后,程序将自动进行监控。如图13.11所示。另外,监控的录像文件和图片文件保存在D盘根目录中,命名格式为系统当前日期。

图13.11  超市摄像头定时监控

技术要点

相关技术要点请参见实例“摄像头监控录像”。另外,本实例利用Timer控件中的定时执行功能,进行数据的定时录像工作。

实现过程

(1)新建一个项目,命名为Ex13_10,默认窗体为Form1,添加一个类文件(.CS),用于编写视频类。

(2)在Form1窗体中,主要添加一个PictrueBox控件,用于显示视频;其他控件的添加如图13.11所示。

(3)主要程序代码。

        private void timer1_Tick(object sender, EventArgs e)

        {

            string strTime="";

            //星期一

            if (chk1.Checked && Convert.ToInt32(DateTime.Now.DayOfWeek)==1)

            {

                strTime = DateTime.Now.ToString("HH:mm");

                DateTime date = Convert.ToDateTime(mtxt1.Text);

                if (strTime == date.ToString("HH:mm"))

                    video.StarKinescope(@"d:/" + DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi");

            }

            //星期二

            if (chk1.Checked && Convert.ToInt32(DateTime.Now.DayOfWeek) == 2)

            {

                strTime = DateTime.Now.ToString("HH:mm");

                DateTime date = Convert.ToDateTime(mtxt2.Text);

                if (strTime == date.ToString("HH:mm"))

                    video.StarKinescope(@"d:/" + DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi");

            }

            //星期三

            if (chk1.Checked && Convert.ToInt32(DateTime.Now.DayOfWeek) == 3)

            {

                strTime = DateTime.Now.ToString("HH:mm");

                DateTime date = Convert.ToDateTime(mtxt3.Text);

                if (strTime == date.ToString("HH:mm"))

                    video.StarKinescope(@"d:/" + DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi");

            }

            //星期四

            if (chk1.Checked && Convert.ToInt32(DateTime.Now.DayOfWeek) == 4)

            {

                strTime = DateTime.Now.ToString("HH:mm");

                DateTime date = Convert.ToDateTime(mtxt4.Text);

                if (strTime == date.ToString("HH:mm"))

                    video.StarKinescope(@"d:/" + DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi");

            }

            //星期五

            if (chk1.Checked && Convert.ToInt32(DateTime.Now.DayOfWeek) == 5)

            {

                strTime = DateTime.Now.ToString("HH:mm");

                DateTime date = Convert.ToDateTime(mtxt5.Text);

                if (strTime == date.ToString("HH:mm"))

                    video.StarKinescope(@"d:/" + DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi");

            }

            //星期六

            if (chk1.Checked && Convert.ToInt32(DateTime.Now.DayOfWeek) == 6)

            {

                strTime = DateTime.Now.ToString("HH:mm");

                DateTime date = Convert.ToDateTime(mtxt6.Text);

                if (strTime == date.ToString("HH:mm"))

                    video.StarKinescope(@"d:/" + DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi");

            }

            //星期日

            if (chk1.Checked && Convert.ToInt32(DateTime.Now.DayOfWeek) == 7)

            {

                strTime = DateTime.Now.ToString("HH:mm");

                DateTime date = Convert.ToDateTime(mtxt7.Text);

                if (strTime == date.ToString("HH:mm"))

                    video.StarKinescope(@"d:/" + DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi");

            }

举一反三

根据本实例,读者可以开发以下程序。

*  车站定时监控系统。

*  公司定时安防系统。 

阅读更多
上一篇ic卡
下一篇语音卡
想对作者说点什么? 我来说一句

幼儿园监控系统解决方案.rar

2011年03月19日 68KB 下载

监控监控监控监控监控天易成

2010年04月16日 5.22MB 下载

监控设备 想要的给你出主意

2010年05月07日 208B 下载

屏幕监控监控全屏,并有截屏

2010年07月21日 246KB 下载

电子监控 电子监控 电子监控

2010年05月01日 135KB 下载

超级监控局域网试用

2017年12月14日 29.95MB 下载

没有更多推荐了,返回首页

关闭
关闭