资源描述
有很多C#获取摄像头的实现方法,都是使用已经过时的技术之所以过时,是因为他们还在使用97年被directshow抛弃的摄像头调用类(avicap32.dll),
现在有比较先进一点的资料,大家到Google里面搜索一下吧!
我自己总结了一下,一些C#获取摄像头的方法很好用的,代码比较少的程序提供给大家下载:
1.C#写的简单的摄像头视频获取源代码
camera.rar
2.我自己正在使用的C#获取摄像头程序,代码相当的短(不到100行),
以下系统必备组件是必需的:
Windows Installer 3.1
.NET Framework 3.5
Debug.rar源代码
c# 获取 摄像头 实现录像
利用普通的简易摄像头,通过C#语言即可开发成简易视频程序。本实例利用市场上购买的普通摄像头,利用VFW技术,实现单路视频监控系统。运行程序,窗体中将显示舰体摄像头采集的视频信息。如图13.9所示。
技术要点
本实例主要使用了VFW(Video for Windows)技术。VFW 是Microsoft公司为开发Windows平台下的视频应用程序提供的软件工具包,提供了一系列应用程序编程接口(API),用户可以通过这些接口很方便地实现视频捕获、视频编辑及视频播放等通用功能,还可利用回调函数开发比较复杂的视频应用程序。该技术的特点是播放视频时不需要专用的硬件设备,而且应用灵活,可以满足视频应用程序开发的需要。Windows操作系统自身就携带了VFW技术,系统安装时,会自动安装VFW的相关组件。
VFW技术主要由六个功能模块组成,下面进行简单说明。
AVICAP32.DLL:包含执行视频捕获的函数,给AVI文件的I/O处理和视频,音频设备驱动程序提供一个高级接口。
MSVIDEO.DLL:包含一套特殊的DrawDib函数,用来处理程序上的视频操作。
MCIAVI.DRV:包括对VFW的MCI命令解释器的驱动程序。
AVIFILE.DLL:包含由标准多媒体I/O(mmio)函数提供的更高级的命令,用来访问.AVI文件。
ICM:压缩管理器,用于管理的视频压缩/解压缩的编译码器。
ACM:音频压缩管理器,提供与ICM相似的服务,适用于波形音频。
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);
参数说明如下。
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);
参数说明如下。
hWnd:窗口句柄。
wMsg:将要发送的消息。
wParam、lParam:消息的参数,每个消息都有两个参数,参数设置由发送的消息而定。
Form1窗体中通过调用视频类中的方法来实现相应的功能。
在【开始录像】按钮的Click事件中添加如下代码:
private void buttonStart_Click(object sender, EventArgs e)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
//btnPz.Enabled = true;
video = new cVideo(picCapture.Handle, picCapture.Width, picCapture.Height);
video.StartWebCam();
}
在【停止录像】按钮的Click事件中添加如下代码:
private void buttonStop_Click(object sender, EventArgs e)
{
buttonStart.Enabled = true;
buttonStop.Enabled = false;
buttonPz.Enabled = false;
video.CloseWebcam();
}
在【拍照】按钮的Click事件下添加如下代码:
private void buttonPz_Click(object sender, EventArgs e)
{
video.GrabImage(picCapture.Handle, "d:\\a.bmp");
}
完整代码如下:
1、Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Video1
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
2、Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Video1
{
public partial class Form1 : Form
{
cVideo video;
public Form1()
{
InitializeComponent();
}
private void buttonStart_Click(object sender, EventArgs e)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
//btnPz.Enabled = true;
video = new cVideo(picCapture.Handle, picCapture.Width, picCapture.Height);
video.StartWebCam();
}
private void buttonStop_Click(object sender, EventArgs e)
{
buttonStart.Enabled = true;
buttonStop.Enabled = false;
buttonPz.Enabled = false;
video.CloseWebcam();
}
private void buttonPz_Click(object sender, EventArgs e)
{
video.GrabImage(picCapture.Handle, "d:\\a.bmp");
}
}
}
3、Form1.Designer.cs
namespace Video1
{
partial class Form1
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param>如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.buttonStart = new System.Windows.Forms.Button();
this.buttonStop = new System.Windows.Forms.Button();
this.buttonPz = new System.Windows.Forms.Button();
this.panelTop = new System.Windows.Forms.Panel();
this.picCapture = new System.Windows.Forms.PictureBox();
this.panelBottom = new System.Windows.Forms.Panel();
this.panelTop.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.picCapture)).BeginInit();
this.panelBottom.SuspendLayout();
this.SuspendLayout();
//
// buttonStart
//
this.buttonStart.Location = new System.Drawing.Point(39, 3);
this.buttonStart.Name = "buttonStart";
this.buttonStart.Size = new System.Drawing.Size(88, 36);
this.buttonStart.TabIndex = 1;
this.buttonStart.Text = "开始录像";
this.buttonStart.UseVisualStyleBackColor = true;
this.buttonStart.Click += new System.EventHandler(this.buttonStart_Click);
//
// buttonStop
//
this.buttonStop.Location = new System.Drawing.Point(181, 3);
this.buttonStop.Name = "buttonStop";
this.buttonStop.Size = new System.Drawing.Size(80, 36);
this.buttonStop.TabIndex = 2;
this.buttonStop.Text = "停止录像";
this.buttonStop.UseVisualStyleBackColor = true;
this.buttonStop.Click += new System.EventHandler(this.buttonStop_Click);
//
// buttonPz
//
this.buttonPz.Location = new System.Drawing.Point(313, 3);
this.buttonPz.Name = "buttonPz";
this.buttonPz.Size = new System.Drawing.Size(77, 36);
this.buttonPz.TabIndex = 3;
this.buttonPz.Text = "拍 照";
this.buttonPz.UseVisualStyleBackColor = true;
this.buttonPz.Click += new System.EventHandler(this.buttonPz_Click);
//
// panelTop
//
this.panelTop.AutoSize = true;
this.panelTop.Controls.Add(this.picCapture);
this.panelTop.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelTop.Location = new System.Drawing.Point(0, 0);
this.panelTop.Name = "panelTop";
this.panelTop.Size = new System.Drawing.Size(468, 372);
this.panelTop.TabIndex = 4;
//
// picCapture
//
this.picCapture.Dock = System.Windows.Forms.DockStyle.Fill;
this.picCapture.InitialImage = ((System.Drawing.Image)(resources.GetObject("picCapture.InitialImage")));
this.picCapture.Location = new System.Drawing.Point(0, 0);
this.picCapture.Name = "picCapture";
this.picCapture.Size = new System.Drawing.Size(468, 372);
this.picCapture.TabIndex = 0;
this.picCapture.TabStop = false;
//
// panelBottom
//
this.panelBottom.Controls.Add(this.buttonStart);
this.panelBottom.Controls.Add(this.buttonStop);
this.panelBottom.Controls.Add(this.buttonPz);
this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panelBottom.Location = new System.Drawing.Point(0, 327);
this.panelBottom.Name = "panelBottom";
this.panelBottom.Size = new System.Drawing.Size(468, 45);
this.panelBottom.TabIndex = 5;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(468, 372);
this.Controls.Add(this.panelBottom);
this.Controls.Add(this.panelTop);
this.Name = "Form1";
this.Text = "Form1";
this.panelTop.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.picCapture)).EndInit();
this.panelBottom.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.PictureBox picCapture;
private System.Windows.Forms.Button buttonStart;
private System.Windows.Forms.Button buttonStop;
private System.Windows.Forms.Button buttonPz;
private System.Windows.Forms.Panel panelTop;
private System.Windows.Forms.Panel panelBottom;
}
}
4、ClassVideoAPI.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using System.IO;
namespace Video1
{
public class VideoAPI //视频API类
{
// 视频API调用
[DllImport("avicap32.dll")]//包含了执行视频捕获的函数,它给AVI文件I/O和视频、音频设备驱动程序提供一个高级接口
public static extern IntPtr capCreateCaptureWindow(string lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hwndParent, int nID);
[DllImport("AVICAP32.dll", CharSet = CharSet.Unicode)]
public static extern bool capGetDriverDescription(int wDriverIndex, StringBuilder lpszName, int cbName, StringBuilder lpszVer, int cbVer);
[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);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, FrameEventHandler lParam);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref BITMAPINFO lParam);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref CAPDRIVERCAPS lParam);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref CAPTUREPARMS lParam);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref CAPSTATUS lParam);
[DllImport("User32.dll")]
public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
[DllImport("avicap32.dll")]
public static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
// 常量
// 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 const string avicap32 = "avicap32.dll";
public const int WM_USER = 1024;
/// <summary>
///WM_CAP_START=WM_USER=1024
/// </summary>
public const int WM_CAP_START = WM_USER;
// start of unicode messages
/// <summary>
/// 开始 WM_USER + 100=1124
/// </summary>
public const int WM_CAP_UNICODE_START = WM_USER + 100; //开始 1124
/// <summary>
/// /获得 CAPSTR EAMPTR
/// WM_CAP_START + 1=1025
/// </summary>
public const int WM_CAP_GET_CAPSTREAMPTR = (WM_CAP_START + 1); //获得 CAPSTR EAMPTR
/// <summary>
/// 设置收回错误 WM_CAP_START + 2=1026
/// </summary>
public const int WM_CAP_SET_CALLBACK_ERROR = (WM_CAP_START + 2); //设置收回错误
/// <summary>
/// 设置收回状态 WM_CAP_START + 3=1027
/// </summary>
public const int WM_CAP_SET_CALLBACK_STATUS = (WM_CAP_START + 3); //设置收回状态
/// <summary>
/// 设置收回出产 WM_CAP_START + 4=1028
/// </summary>
public const int WM_CAP_SET_CALLBACK_YIELD = (WM_CAP_START + 4); //设置收回出产
/// <summary>
/// 设置收回结构 WM_CAP_START + 5=1029
/// </summary>
public const int WM_CAP_SET_CALLBACK_FRame = (WM_CAP_START + 5); //设置收回结构
/// <summary>
/// 设置收回视频流 WM_CAP_START + 6=1030
/// </summary>
public const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = (WM_CAP_START + 6); //设置收回视频流
/// <summary>
/// 设置收回视频波流 WM_CAP_START +7=1031
/// </summary>
public const int WM_CAP_SET_CALLBACK_WAVESTREAM = (WM_CAP_START + 7); //设置收回视频波流
/// <summary>
/// 获得使用者数据 WM_CAP_START + 8=1032
/// </summary>
public const int WM_CAP_GET_USER_DATA = (WM_CAP_START + 8); //获得使用者数据
/// <summary>
/// 设置使用者数据 WM_CAP_START + 9=1033
/// </summary>
public const int WM_CAP_SET_USER_DATA = (WM_CAP_START + 9); //设置使用者数据
/// <summary>
/// 驱动程序连接 WM_CAP_START + 10=1034
/// </summary>
public const int WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10); //驱动程序连接
/// <summary>
/// 断开启动程序连接 WM_CAP_START + 11=1035
/// </summary>
public const int WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11); //断开启动程序连接
/// <summary>
/// 获得驱动程序名字 WM_CAP_START + 12=1036
/// </summary>
public const int WM_CAP_DRIVER_GET_NAME = (WM_CAP_START + 12); //获得驱动程序名字
/// <summary>
/// 获得驱动程序版本 WM_CAP_START + 13=1037
/// </summary>
public const int WM_CAP_DRIVER_GET_VERSION = (WM_CAP_START + 13); //获得驱动程序版本
/// <summary>
/// 获得驱动程序帽子 WM_CAP_START + 14=1038
/// </summary>
public const int WM_CAP_DRIVER_GET_CAPS = (WM_CAP_START + 14); //获得驱动程序帽子
/// <summary>
/// 设置捕获文件 WM_CAP_START + 20=1044
/// </summary>
public const int WM_CAP_FILE_SET_CAPTURE_FILE = (WM_CAP_START + 20); //设置捕获文件
/// <summary>
/// 获得捕获文件 WM_CAP_START + 21=1045
/// </summary>
public const int WM_CAP_FILE_GET_CAPTURE_FILE = (WM_CAP_START + 21); //获得捕获文件
/// <summary>
/// 另存文件为 WM_CAP_START + 23=1047
/// </summary>
public const int WM_CAP_FILE_SAVEAS = (WM_CAP_START + 23); //另存文件为
/// <summary>
/// 保存文件 WM_CAP_START + 25=1049
/// </summary>
public const int WM_CAP_FILE_SAVEDIB = (WM_CAP_START + 25); //保存文件
// out of order to save on ifdefs
/// <summary>
/// 分派文件 WM_CAP_START + 22=1044
/// </summary>
public const int WM_CAP_FILE_ALLOCATE = (WM_CAP_START + 22); //分派文件
/// <summary>
/// 设置开始文件 WM_CAP_START + 24=1046
/// </summary>
public const int WM_CAP_FILE_SET_INFOCHUNK = (WM_CAP_START + 24); //设置开始文件
/// <summary>
/// 编辑复制 WM_CAP_START + 30=1054
/// </summary>
public const int WM_CAP_EDIT_COPY = (WM_CAP_START + 30); //编辑复制
/// <summary>
/// 设置音频格式 WM_CAP_START + 35=1059
/// </summary>
public const int WM_CAP_SET_AUDIOFORMAT = (WM_CAP_START + 35); //设置音频格式
/// <summary>
/// 捕获音频格式 WM_CAP_START + 36=1060
/// </summary>
public const int WM_CAP_GET_AUDIOFORMAT = (WM_CAP_START + 36); //捕获音频格式
/// <summary>
/// 打开视频格式设置对话框 WM_CAP_START + 41=1065
/// </summary>
public const int WM_CAP_DLG_VIDEOFORMAT = (WM_CAP_START + 41); //1065 打开视频格式设置对话框
/// <summary>
/// 打开属性设置对话框,设置对比度、亮度等 WM_CAP_START + 42=1066
/// </summary>
public const int WM_CAP_DLG_VIDEOSOURCE = (WM_CAP_START + 42); //1066 打开属性设置对话框,设置对比度、亮度等。
/// <summary>
/// 打开视频显示 WM_CAP_START + 43=1067
/// </summary>
public const int WM_CAP_DLG_VIDEODISPLAY = (WM_CAP_START + 43); //1067 打开视频显示
/// <summary>
/// 获得视频格式 WM_CAP_START + 44=1068
/// </summary>
public const int WM_CAP_GET_VIDEOFORMAT = (WM_CAP_START + 44); //1068 获
展开阅读全文