摄像头视频录制及图象的捕捉保存

    技术2022-05-11  70

          在网上找了一些关于控制摄像头编程的资料,不知道为什么在我这里总是有些问题,不过最终还是克服了,可惜的是我没有把排错的过程记录下来,现在把代码贴出来,发个帖子吧!

          运行环境:VS2005   C#

          具体实现代码: 

     using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;

    using System.Collections;using webcam;

     

    namespace WebCanon{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }

            private void Form1_Load(object sender, 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_play_Click(object sender, 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, EventArgs e)        {            b_play.Enabled = true;            b_stop.Enabled = false;            wc.CloseWebcam();        }

            private void button1_Click(object sender, EventArgs e)        {            wc.Kinescope(Application.StartupPath.ToString()+"//111.avi");            this.button1.Enabled = false;            this.button2.Enabled = true ;        }

            private void button2_Click(object sender, EventArgs e)        {            wc.StopKinescope();            this.button1.Enabled = true;            this.button2.Enabled = false;        }

            /// <summary>        /// 抓图        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void button3_Click(object sender, EventArgs e)        {            wc.GrabImage(Application.StartupPath+"//my.bmp");        }    }}

     

    调用的类文件:

    using System;using System.Runtime.InteropServices;

    namespace webcam{    ///     /// avicap 的摘要说明。    ///     public class showVideo    {        [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;

            public const int WM_CAP_SAVEDIB = WM_USER + 25;        public const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_USER + 20;        public const int WM_CAP_SEQUENCE = WM_USER + 62;        public const int WM_CAP_STOP = WM_USER + 68;

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

            /// <summary>         /// 抓图         /// </summary>         /// <param name="path">要保存bmp文件的路径</param>         public void GrabImage(IntPtr hCapWnd,string path)        {

                IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);            showVideo.SendMessage(hCapWnd, showVideo.WM_CAP_SAVEDIB, 0, hBmp.ToInt32());

            }        public void GrabImage(string path)        {

                IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);            showVideo.SendMessage(lwndC, showVideo.WM_CAP_SAVEDIB, 0, hBmp.ToInt32());

            }        /// <summary>         /// 录像         /// </summary>         /// <param name="path">要保存avi文件的路径</param>         public void Kinescope(IntPtr hCapWnd,string path)        {            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);            showVideo.SendMessage(hCapWnd, showVideo.WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt32());            showVideo.SendMessage(hCapWnd, showVideo.WM_CAP_SEQUENCE, 0, 0);        }        public void Kinescope(string path)        {            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);            showVideo.SendMessage(lwndC, showVideo.WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt32());            showVideo.SendMessage(lwndC, showVideo.WM_CAP_SEQUENCE, 0, 0);        }        /// <summary>         /// 停止录像         /// </summary>         public void StopKinescope(IntPtr hCapWnd)        {            showVideo.SendMessage(hCapWnd, showVideo.WM_CAP_STOP, 0, 0);        }         public void StopKinescope()        {            showVideo.SendMessage(lwndC, showVideo.WM_CAP_STOP, 0, 0);        }         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);        }    }

    }


    最新回复(0)