摄像头编程

it2025-03-13  22

摄像头编程安装摄像头后,一般可以找到一个avicap32.dll文件

这是一个关于设想头的类

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  );

//  constantspublic  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  methodspublic  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  classpublic  class  WebCamera{//  Constructurpublic  WebCamera(IntPtr  handle,  int  width,int  height){mControlPtr  =  handle;mWidth  =  width;mHeight  =  height;}//  delegate  for  frame  callbackpublic  delegate  void  RecievedFrameEventHandler(byte[]  data);public  event  RecievedFrameEventHandler  RecievedFrame;private  IntPtr  lwndC;  //  Holds  the  unmanaged  handle  of  the  controlprivate  IntPtr  mControlPtr;  //  Holds  the  managed  pointer  of  the  controlprivate  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  camerapublic  void  CloseWebcam(){this.capDriverDisconnect(this.lwndC);}//  start  the  web  camerapublic  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  functionsprivate  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();}}}

转载于:https://www.cnblogs.com/HappyQQ/archive/2008/04/20/1162851.html

相关资源:基于Linux摄像头编程
最新回复(0)