Coin163

首页 > c#摄像头编程

c#摄像头编程

2020腾讯云10周年活动,优惠非常大!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1040

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
入口地址https://www.aliyun.com/minisite/goods

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

原文

安装摄像头后,一般可以找到一个avicap32.dll文件    这是一个关于设想头的类 using  system; using  System.Runtime.InteropServices; namespace  webcam { ///   ///  avicap  的摘要说明。 /

------分隔线----------------------------
相关推荐