• c#摄像头编程实例 (转)


    摄像头编程 
    安装摄像头后,一般可以找到一个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  );

    //  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();
    }
    }
    }
  • 相关阅读:
    DBCP连接池
    获取自动生成的主键
    将图片存储到数据库中
    java.nio.file.AccessDeniedException
    mysql8 :客户端连接caching-sha2-password问题
    理解 Android Build 系统(转载)
    C build error fix
    linux硬链接和软链接的区别
    du -sh
    linux proc maps文件分析
  • 原文地址:https://www.cnblogs.com/lenmom/p/3714647.html
Copyright © 2020-2023  润新知