logo资料库

C#,winform实现操作摄像头录像并保存.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
在一些银行、大型商场、办公楼、升降电梯中,为了保障公有财产、商品、 办公设备、资料、人身等的安全,都设有监控系统。在出现问题时,用户可以通 过监控系统查找原因。下面的几个实例分别实现了摄像头监控与定时监控的功能。 实例 425 简易视频程序 实例说明 利用普通的简易摄像头,通过 C#语言即可开发成简易视频程序。本实例利用市场上购买的普通摄像头, 利用 VFW 技术,实现单路视频监控系统。运行程序,窗体中将显示舰体摄像头采集的视频信息。如图 13.9 所示。 技术要点 本实例主要使用了 VFW(Video for Windows)技术。VFW 是 Microsoft 公司为开发 Windows 平台下的 视频应用程序提供的软件工具包,提供了一系列应用程序编程接口(API),用户可以通过这些接口很 方 便地实现视频捕获、视频编辑及视频播放等通用功能,还可利用回调函数开发比较复杂的视频应用程序。 该技术的特点是播放视频时不需要专用的硬件设备,而且 应用灵活,可以满足视频应用程序开发的需要。 Windows 操作系统自身就携带了 VFW 技术,系统安装时,会自动安装 VFW 的相关组件。 VFW 技术主要由六个功能模块组成,下面进行简单说明。 l AVICAP32.DLL:包含执行视频捕获的函数,给 AVI 文件的 I/O 处理和视频,音频设备驱动程序提 供一个高级接口。 l l l l l MSVIDEO.DLL:包含一套特殊的 DrawDib 函数,用来处理程序上的视频操作。 MCIAVI.DRV:包括对 VFW 的 MCI 命令解释器的驱动程序。 AVIFILE.DLL:包含由标准多媒体 I/O(mmio)函数提供的更高级的命令,用来访问.AVI 文件。 ICM:压缩管理器,用于管理的视频压缩/解压缩的编译码器。 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 l l l l l l lpszWindowName:标识窗口的名称。 dwStyle:标识窗口风格。 x、y:标识窗口的左上角坐标。 nWidth、nHeight:标识窗口的宽度和高度。 hWnd:标识父窗口句柄。 nID:标识窗口 ID。 返回值:视频捕捉窗口句柄。
(2)SendMessage 函数 用于向 Windows 系统发送消息机制。 [DllImport("User32.dll")] private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); l l l 参数说明如下。 hWnd:窗口句柄。 wMsg:将要发送的消息。 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); lParam); [DllImport("User32.dll")] public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int // 常量 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; //视频高度 /// /// 打开视频设备 /// 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)) 100, 0); 0); { } VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEWRATE, VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEW, true, } /// /// 关闭视频设备 /// public void CloseWebcam() { } /// /// /// /// VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_DISCONNECT, 0, 0); 拍照 要保存 bmp 文件的路径 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 摄像头监控录像 实例说明
本例是为通过摄像头来实现监控录像的程序。运行本例后,单击【开始监 控】按钮,程序将自动开始录像,录像文件(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)视频类中主要程序代码如下: /// /// /// /// 开始录像 要保存录像的路径 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); /// /// 停止录像 /// 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"))
DateTime.Today.Month.ToString() + DateTime.Today.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi"); video.StarKinescope(@"d:\" + } //星期五 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"); } 举一反三 根据本实例,读者可以开发以下程序。 车站定时监控系统。 公司定时安防系统。
分享到:
收藏