zoukankan      html  css  js  c++  java
  • 【转】摄像头编程实例

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

  • 相关阅读:
    变量1
    PHP 函数
    发送post请求
    XXE
    CSRF
    Html基础
    暴力破解
    Brup sute
    XSS
    URL 传参转义 (特殊符号转义)
  • 原文地址:https://www.cnblogs.com/fx2008/p/2240918.html
Copyright © 2011-2022 走看看