net中捕获摄像头视频的方式及对比How to Capture Camera Video via NetWord文件下载.docx
- 文档编号:20487282
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:13
- 大小:526.05KB
net中捕获摄像头视频的方式及对比How to Capture Camera Video via NetWord文件下载.docx
《net中捕获摄像头视频的方式及对比How to Capture Camera Video via NetWord文件下载.docx》由会员分享,可在线阅读,更多相关《net中捕获摄像头视频的方式及对比How to Capture Camera Video via NetWord文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
如果您只是需要预览并保存视频,它很好用。
OpenCv
OpenCv对VFW和DirectShow的视频捕获部分进行了很好的封装,能够很方便的获取到某帧的内容,也可以将结果保存到视频文件中。
使用OpenCv的示例如下:
OpenCv
IntPtrptrCapture=CvInvoke.cvCreateCameraCapture(param.deviceInfo.Index);
while(!
stop)
{
IntPtrptrImage=CvInvoke.cvQueryFrame(ptrCapture);
lock(lockObject)
stop=stopCapture;
}
CvInvoke.cvReleaseCapture(refptrCapture);
不过OpenCv并未对音频捕获进行封装,如果需要同时录制音频,这个搞不定。
值得注意的是,从OpenCv1.1开始已经实现了对DirectShow的封装,这跟网上很多人所说的OpenCv使用VFW进行视频捕获效率低下这种观点不一致。
关于OpenCv使用DirectShow的论据请看本文的附录。
EmguCv
EmguCv是对OpenCv在.net的封装,继承了OpenCv快速的优点,同时它更加好用。
使用EmguCv的示例代码如下:
EmguCv
Capturecapture=newCapture(param.deviceInfo.Index);
pbCapture.Image=capture.QueryFrame().Bitmap;
capture.Dispose();
AForge
AForge是一套纯正的.net开源图像处理类库,它的视频捕获类也是基于DirectShow的,但更加好用,功能更多,从使用和帮助来看更类似微软的类库。
AForge
captureAForge=newVideoCaptureDevice(cameraDevice.MonikerString);
captureAForge.NewFrame+=newNewFrameEventHandler(captureAForge_NewFrame);
captureAForge.Start();
//...
captureAForge.SignalToStop();
privatevoidcaptureAForge_NewFrame(objectsender,NewFrameEventArgseventArgs)
pbCapture.Image=(Bitmap)eventArgs.Frame.Clone();
对比
介绍完它们之后,我们来比较下它们。
它们都是基于DirectShow的,所以性能几乎一样。
实际上,我个人认为,摄像头所用的硬件和驱动程序的支持对性能影响更大。
我的摄像头在Windows7下没有专门的驱动程序,只能使用Microsoft提供的默认驱动,性能比WindowsXp要差一截。
值得注意的是主要有几点:
(1)只有DirectX.Capture实现了对音频的捕获;
(2)只有DirectX.Capture不能获取单独的某帧图像;
(3)EmguCv的免费版基于商业许可,而其他类库的许可都很宽松;
(4)AForge的示例和帮助比较好,而且功能多些。
附录:
OpenCv也用DirectShow来捕获视频
通过分析OpenCv2.0的源代码,我得出了OpenCv使用DirectShow来捕获视频的结论。
证据如下:
DirectShowInOpenCv
(1)
//_highgui.hline:
100
#if(_MSC_VER>
=1400||defined__GNUC__)&
&
!
definedWIN64&
defined_WIN64
#defineHAVE_VIDEOINPUT1
#endif
(2)
//cvcap_dshow.cppline:
44
#ifdefHAVE_VIDEOINPUT
#include"
videoinput.h"
/*********************CapturingvideofromcameraviaVFW*********************/
classCvCaptureCAM_DShow:
publicCvCapture
(3)
//cvapp.cppline:
102
CV_IMPLCvCapture*cvCreateCameraCapture(intindex)
{
//.....
//line:
140
switch(domains[i])
#ifdefHAVE_VIDEOINPUT
caseCV_CAP_DSHOW:
capture=cvCreateCameraCapture_DShow(index);
if(capture)
returncapture;
break;
#endif
本文完整源代码
完整代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Diagnostics;
usingSystem.Runtime.InteropServices;
usingAForge.Video;
usingAForge.Video.DirectShow;
usingEmgu.CV;
usingEmgu.CV.CvEnum;
usingEmgu.CV.Structure;
usingEmgu.CV.UI;
usingSystem.Threading;
namespaceImageProcessLearn
publicpartialclassFormCameraCapture:
Form
privateintframesCaptured;
//已经捕获的视频帧数
privateintframeCount;
//需要捕获的总帧数
privateStopwatchsw;
//计时器
privateVideoCaptureDevicecaptureAForge=null;
//AForge视频捕获对象
privateboolstopCapture;
//是否停止捕获视频
privateobjectlockObject=newobject();
publicFormCameraCapture()
InitializeComponent();
sw=newStopwatch();
//窗体加载时,获取视频捕获设备列表
privatevoidFormCameraCapture_Load(objectsender,EventArgse)
FilterInfoCollectionvideoDevices=newFilterInfoCollection(FilterCategory.VideoInputDevice);
if(videoDevices!
=null&
videoDevices.Count>
0)
intidx=0;
foreach(FilterInfodeviceinvideoDevices)
cmbCaptureDevice.Items.Add(newDeviceInfo(device.Name,device.MonikerString,idx,FilterCategory.VideoInputDevice));
idx++;
cmbCaptureDevice.SelectedIndex=0;
//当改变视频设备时,重新填充该设备对应的能力
privatevoidcmbCaptureDevice_SelectedIndexChanged(objectsender,EventArgse)
if(cmbCaptureDevice.SelectedItem!
=null)
//保存原来选择的设备能力
SizeoldFrameSize=newSize(0,0);
intoldMaxFrameRate=0;
if(cmbDeviceCapability.SelectedItem!
oldFrameSize=((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).FrameSize;
oldMaxFrameRate=((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).MaxFrameRate;
//清除设备能力
cmbDeviceCapability.Items.Clear();
//添加新的设备能力
intoldCapIndex=-1;
//原来选择的设备能力的新索引
VideoCaptureDevicevideo=newVideoCaptureDevice(((DeviceInfo)cmbCaptureDevice.SelectedItem).MonikerString);
for(inti=0;
i<
video.VideoCapabilities.Length;
i++)
VideoCapabilitiescap=video.VideoCapabilities[i];
DeviceCapabilityInfocapInfo=newDeviceCapabilityInfo(cap.FrameSize,cap.MaxFrameRate);
cmbDeviceCapability.Items.Add(capInfo);
if(oldFrameSize==capInfo.FrameSize&
oldMaxFrameRate==capInfo.MaxFrameRate)
oldCapIndex=i;
//重新选择原来的设备能力,或者选一个新的能力
if(oldCapIndex==-1)
oldCapIndex=0;
cmbDeviceCapability.SelectedIndex=oldCapIndex;
//当改变设备能力时
privatevoidcmbDeviceCapability_SelectedIndexChanged(objectsender,EventArgse)
if(int.Parse(txtRate.Text)>
=((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).MaxFrameRate)
txtRate.Text=((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).MaxFrameRate.ToString();
//性能测试:
测试获取指定帧数的视频,并将其转换成图像,所需要的时间,然后计算出FPS
privatevoidbtnPerformTest_Click(objectsender,EventArgse)
intframeCount=int.Parse(txtFrameCount.Text);
if(frameCount<
=0)
frameCount=300;
DeviceInfodevice=(DeviceInfo)cmbCaptureDevice.SelectedItem;
btnPerformTest.Enabled=false;
btnStart.Enabled=false;
txtResult.Text+=PerformTestWithAForge(device.MonikerString,frameCount);
txtResult.Text+=PerformTestWithEmguCv(device.Index,frameCount);
txtResult.Text+=PerformTestWithOpenCv(device.Index,frameCount);
btnPerformTest.Enabled=true;
btnStart.Enabled=true;
//AForge性能测试
privatestringPerformTestWithAForge(stringdeviceMonikerString,intframeCount)
VideoCaptureDevicevideo=newVideoCaptureDevice(deviceMonikerString);
video.NewFrame+=newNewFrameEventHandler(PerformTest_NewFrame);
video.DesiredFrameSize=((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).FrameSize;
video.DesiredFrameRate=int.Parse(txtRate.Text);
framesCaptured=0;
this.frameCount=frameCount;
video.Start();
sw.Reset();
sw.Start();
video.WaitForStop();
doubletime=sw.Elapsed.TotalMilliseconds;
returnstring.Format("
AForge性能测试,帧数:
{0},耗时:
{1:
F05}毫秒,FPS:
{2:
F02},设定({3})\r\n"
frameCount,time,1000d*frameCount/time,GetSettings());
voidPerformTest_NewFrame(objectsender,NewFrameEventArgseventArgs)
framesCaptured++;
if(framesCaptured>
frameCount)
sw.Stop();
VideoCaptureDevicevideo=senderasVideoCaptureDevice;
video.SignalToStop();
//EmguCv性能测试
privatestringPerformTestWithEmguCv(intdeviceIndex,intframeCount)
Capturevideo=newCapture(deviceIndex);
video.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_WIDTH,((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).FrameSize.Width);
video.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT,((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).FrameSize.Height);
video.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FPS,double.Parse(txtRate.Text));
frameCount;
video.QueryFrame();
video.Dispose();
EmguCv性能测试,帧数:
//OpenCv性能测试
privatestringPerformTestWithOpenCv(intdeviceIndex,intframeCount)
IntPtrptrVideo=CvInvoke.cvCreateCameraCapture(deviceIndex);
CvInvoke.cvSetCaptureProperty(ptrVideo,CAP_PROP.CV_CAP_PROP_FRAME_WIDTH,((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).FrameSize.Width);
CvInvoke.cvSetCaptureProperty(ptrVideo,CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT,((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).FrameSize.Height);
CvInvoke.cvSetCaptureProperty(ptrVideo,CAP_PROP.CV_CAP_PROP_FPS,double.Parse(txtRate.Text));
CvInvoke.cvQueryFrame(ptrVideo);
CvInvoke.cvReleaseCapture(refptrVideo);
OpenCv性能测试,帧数:
//得到设置所对应的字符串
privatestringGetSettings()
摄像头:
{0},尺寸:
{1}x{2},FPS:
{3}"
((DeviceInfo)cmbCaptureDevice.SelectedItem).Name,
((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).FrameSize.Width,
((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).FrameSize.Height,
txtRate.Text);
//开始捕获视频
privatevoidbtnStart_Click(objectsender,EventArgse)
//得到设置项
DeviceInfocameraDevice=(DeviceInfo)cmbCaptureDevice.SelectedItem;
SizeframeSize=((DeviceCapabilityInfo)cmbDeviceCapability.SelectedItem).FrameSize;
int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- net中捕获摄像头视频的方式及对比How to Capture Camera Video via Net 捕获 摄像头 视频 方式 对比 How
链接地址:https://www.bdocx.com/doc/20487282.html