Welcome

首页 / 软件开发 / .NET编程技术 / .net中捕获摄像头视频的方式及对比(How to Capture Camera Video via .Net)

.net中捕获摄像头视频的方式及对比(How to Capture Camera Video via .Net)2010-11-10 博客园 王先荣随着Windows操作系统的不断演变,用于捕获视频的API接口也在进化,微软提 供了VFW、DirectShow和MediaFoundation这三代接口。其中VFW早已被DirectShow 取代,而最新的MediaFoundation被Windows Vista和Windows 7所支持。可惜的是 ,上述接口基于COM技术且灵活性很大,在中并不方便直接使用。

.net封装

老外有很多活雷锋,他们奉献了不少的开源项目,DirectShow.net是对 DirectShow的封装,而MediaFoundation.net是对MediaFoundation的封装。它们 都能在http://sourceforge.net上找到。这两个封装之后的类库基本上跟原来的 COM是一一对应的关系,可以用于视频捕获,但是用起来还是不够简便。

通过不断的google搜索,我认为以下类库对视频捕获封装得不错,它们是: DirectX.Capture、OpenCv、EmguCv和AForge。

DirectX.Capture

DirectX.Capture是发表在CodeProject上的一个项目,它能很方便的捕获视频 和音频,在窗口预览,并将结果保存到文件。使用DirectX.Capture的示例如下:

DirectX.Capture

Capture capture = new Capture( Filters.VideoInputDevices [0],
Filters.AudioInputDevices[1] );
capture.Filename = "C:MyVideo.avi";
capture.Start();
//...
capture.Stop();

但是,它没有提供单独获取某帧内容的方法。如果您只是需要预览并保存视频 ,它很好用。

OpenCv

OpenCv对VFW和DirectShow的视频捕获部分进行了很好的封装,能够很方便的 获取到某帧的内容,也可以将结果保存到视频文件中。使用OpenCv的示例如下:

OpenCv

IntPtr ptrCapture = CvInvoke.cvCreateCameraCapture (param.deviceInfo.Index);
while (!stop)
{
IntPtr ptrImage = CvInvoke.cvQueryFrame (ptrCapture);
lock (lockObject)
{
stop = stopCapture;
}
}
CvInvoke.cvReleaseCapture(ref ptrCapture);