摄像头编程 选择自 libiegoupan 的 Blog

本文介绍如何使用 C# 和 avicap32.dll 库实现摄像头的视频捕获及预览功能。通过创建窗口、获取设备描述、设置回调等步骤,实现了摄像头视频流的实时显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读:
  这是一个关于设想头的类
  using System;
  using System.Runtime.InteropServices;
  namespace webcam
  {
  ///
  /// avicap 的摘要说明。
  ///
  public class showVideo
  {
  // showVideo calls
  [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, 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 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 );
  // Constants
  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;
  
  // Structures
  [StructLayout(LayoutKind.Sequential)] public struct VIDEOHDR
  {
  [MarshalAs(UnmanagedType.I4)] public int lpData;
  [MarshalAs(UnmanagedType.I4)] public int dwBufferLength;
  [MarshalAs(UnmanagedType.I4)] public int dwBytesUsed;
  [MarshalAs(UnmanagedType.I4)] public int dwTimeCaptured;
  [MarshalAs(UnmanagedType.I4)] public int dwUser;
  [MarshalAs(UnmanagedType.I4)] public int dwFlags;
  [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] public int[] dwReserved;
  }
  [StructLayout(LayoutKind.Sequential)] public struct BITMAPINFOHEADER
  {
  [MarshalAs(UnmanagedType.I4)] public Int32 biSize ;
  [MarshalAs(UnmanagedType.I4)] public Int32 biWidth ;
  [MarshalAs(UnmanagedType.I4)] public Int32 biHeight ;
  [MarshalAs(UnmanagedType.I2)] public short biPlanes;
  [MarshalAs(UnmanagedType.I2)] public short biBitCount ;
  [MarshalAs(UnmanagedType.I4)] public Int32 biCompression;
  [MarshalAs(UnmanagedType.I4)] public Int32 biSizeImage;
  [MarshalAs(UnmanagedType.I4)] public Int32 biXPelsPerMeter;
  [MarshalAs(UnmanagedType.I4)] public Int32 biYPelsPerMeter;
  [MarshalAs(UnmanagedType.I4)] public Int32 biClrUsed;
  [MarshalAs(UnmanagedType.I4)] public Int32 biClrImportant;
  }
  [StructLayout(LayoutKind.Sequential)] public struct BITMAPINFO
  {
  [MarshalAs(UnmanagedType.Struct, SizeConst=40)] public BITMAPINFOHEADER bmiHeader;
  [MarshalAs(UnmanagedType.ByValArray, SizeConst=1024)] public Int32[] bmiColors;
  }
  
  public delegate void FrameEventHandler(IntPtr lwnd, IntPtr lpVHdr);
  
  // Public methods
  public static object GetStructure(IntPtr ptr,ValueType structure)
  {
  return Marshal.PtrToStructure(ptr,structure.GetType());
  }
  
  public static object GetStructure(int ptr,ValueType structure)
  {
  return GetStructure(new IntPtr(ptr),structure);
  }
  
  public static void Copy(IntPtr ptr,byte[] data)
  {
  Marshal.Copy(ptr,data,0,data.Length);
  }
  
  public static void Copy(int ptr,byte[] data)
  {
  Copy(new IntPtr(ptr),data);
  }
  
  public static int SizeOf(object structure)
  {
  return Marshal.SizeOf(structure);
  }
  }
  //Web Camera Class
  public class WebCamera
  {
  // Constructur
  public WebCamera(IntPtr handle, int width,int height)
  {
  mControlPtr = handle;
  mWidth = width;
  mHeight = height;
  }
  
  // delegate for frame callback
  public delegate void RecievedFrameEventHandler(byte[] data);
  public event RecievedFrameEventHandler RecievedFrame;
  
  private IntPtr lwndC; // Holds the unmanaged handle of the control
  private IntPtr mControlPtr; // Holds the managed pointer of the control
  private int mWidth;
  private int mHeight;
  
  private showVideo.FrameEventHandler mFrameEventHandler; // Delegate instance for the frame callback - must keep alive! gc should NOT collect it
  
  // Close the web camera
  public void CloseWebcam()
  {
  this.capDriverDisconnect(this.lwndC);
  }
  
  // start the web camera
  public void StartWebCam()
  {
  byte[] lpszName = new byte[100];
  byte[] lpszVer = new byte[100];
  
  showVideo.capGetDriverDescriptionA(0, lpszName, 100,lpszVer, 100);
  this.lwndC = showVideo.capCreateCaptureWindowA(lpszName, showVideo.WS_VISIBLE + showVideo.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);
  
  if (this.capDriverConnect(this.lwndC, 0))
  {
  this.capPreviewRate(this.lwndC, 66);
  this.capPreview(this.lwndC, true);
  showVideo.BITMAPINFO bitmapinfo = new showVideo.BITMAPINFO();
  bitmapinfo.bmiHeader.biSize = showVideo.SizeOf(bitmapinfo.bmiHeader);
  bitmapinfo.bmiHeader.biWidth = 352;
  bitmapinfo.bmiHeader.biHeight = 288;
  bitmapinfo.bmiHeader.biPlanes = 1;
  bitmapinfo.bmiHeader.biBitCount = 24;
  this.capSetVideoFormat(this.lwndC, ref bitmapinfo, showVideo.SizeOf(bitmapinfo));
  this.mFrameEventHandler = new showVideo.FrameEventHandler(FrameCallBack);
  this.capSetCallbackOnFrame(this.lwndC, this.mFrameEventHandler);
  showVideo.SetWindowPos(this.lwndC, 0, 0, 0, mWidth , mHeight , 6);
  }
  }
  // private functions
  private bool capDriverConnect(IntPtr lwnd, short i)
  {
  return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_CONNECT, i, 0);
  }
  private bool capDriverDisconnect(IntPtr lwnd)
  {
  return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_DISCONNECT, 0, 0);
  }
  
  private bool capPreview(IntPtr lwnd, bool f)
  {
  return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEW , f, 0);
  }
  private bool capPreviewRate(IntPtr lwnd, short wMS)
  {
  return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEWRATE, wMS, 0);
  }
  
  private bool capSetCallbackOnFrame(IntPtr lwnd, showVideo.FrameEventHandler lpProc)
  {????
  return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_CALLBACK_FRAME, 0, lpProc);
  }
  private bool capSetVideoFormat(IntPtr hCapWnd, ref showVideo.BITMAPINFO BmpFormat, int CapFormatSize)
  {
  return showVideo.SendMessage(hCapWnd, showVideo.WM_CAP_SET_VIDEOFORMAT, CapFormatSize, ref BmpFormat);
  }
  private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr)
  {
  showVideo.VIDEOHDR videoHeader = new showVideo.VIDEOHDR();
  byte[] VideoData;
  videoHeader = (showVideo.VIDEOHDR)showVideo.GetStructure(lpVHdr,videoHeader);
  VideoData = new byte[videoHeader.dwBytesUsed];
  showVideo.Copy(videoHeader.lpData ,VideoData);
  if (this.RecievedFrame != null)
  this.RecievedFrame (VideoData);
  }
  }
  }
  具体调用如下:
  using System;
  using System.Drawing;
  using System.Collections;
  using System.ComponentModel;
  using System.Windows.Forms;
  using System.Data;
  using webcam;
  namespace webcam
  {
  ///
  /// Form1 的摘要说明。
  ///
  public class Form1 : System.Windows.Forms.Form
  {
  private System.Windows.Forms.Panel panelPreview;
  private System.Windows.Forms.Button b_play;
  private System.Windows.Forms.Button b_stop;
  ///
  /// 必需的设计器变量。
  ///
  private System.ComponentModel.Container components = null;
  WebCamera wc;
  public Form1()
  {
  //
  // Windows 窗体设计器支持所必需的
  //
  InitializeComponent();
  //
  // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  //
  }
  ///
  /// 清理所有正在使用的资源。
  ///
  protected override void Dispose( bool disposing )
  {
  if( disposing )
  {
  if (components != null)
  {
  components.Dispose();
  }
  }
  base.Dispose( disposing );
  }
  #region Windows 窗体设计器生成的代码
  ///
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  ///
  private void InitializeComponent()
  {
  this.b_play = new System.Windows.Forms.Button();
  this.panelPreview = new System.Windows.Forms.Panel();
  this.b_stop = new System.Windows.Forms.Button();
  this.SuspendLayout();
  //
  // b_play
  //
  this.b_play.Location = new System.Drawing.Point(280, 368);
  this.b_play.Name = "b_play";
  this.b_play.TabIndex = 0;
  this.b_play.Text = "&Play";
  this.b_play.Click += new System.EventHandler(this.button1_Click);
  //
  // panelPreview
  //
  this.panelPreview.Location = new System.Drawing.Point(8, 8);
  this.panelPreview.Name = "panelPreview";
  this.panelPreview.Size = new System.Drawing.Size(344, 272);
  this.panelPreview.TabIndex = 1;
  //
  // b_stop
  //
  this.b_stop.Enabled = false;
  this.b_stop.Location = new System.Drawing.Point(360, 368);
  this.b_stop.Name = "b_stop";
  this.b_stop.TabIndex = 2;
  this.b_stop.Text = "&Stop";
  this.b_stop.Click += new System.EventHandler(this.b_stop_Click);
  //
  // Form1
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  this.ClientSize = new System.Drawing.Size(464, 413);
  this.Controls.Add(this.b_stop);
  this.Controls.Add(this.panelPreview);
  this.Controls.Add(this.b_play);
  this.MaximizeBox = false;
  this.MinimizeBox = false;
  this.Name = "Form1";
  this.Text = "GoodView test Web Camera";
  this.Load += new System.EventHandler(this.Form1_Load);
  this.ResumeLayout(false);
  }
  #endregion
  ///
  /// 应用程序的主入口点。
  ///
  [STAThread]
  static void Main()
  {
  Application.Run(new Form1());
  }
  private void Form1_Load(object sender, System.EventArgs e)
  {
  b_play.Enabled = false;
  b_stop.Enabled = true;
  panelPreview.Size = new Size(330,330);
  wc = new WebCamera( panelPreview.Handle,panelPreview.Width,panelPreview.Height);
  wc.StartWebCam();
  }
  private void button1_Click(object sender, System.EventArgs e)
  {
  b_play.Enabled = false;
  b_stop.Enabled = true;
  panelPreview.Size = new Size(330,330);
  wc = new WebCamera( panelPreview.Handle,panelPreview.Width,panelPreview.Height);
  wc.StartWebCam();
  }
  private void b_stop_Click(object sender, System.EventArgs e)
  {
  b_play.Enabled = true;
  b_stop.Enabled = false;
  wc.CloseWebcam();
  }
  }
  }

本文转自
http://blog.youkuaiyun.com/chjk1/articles/109092.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值