运维开发网

调用USB摄像头的方法

运维开发网 https://www.qedev.com 2022-05-01 16:57 出处:网络
这篇文章主要为大家详细介绍了C#调用USB摄像头的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


这篇文章主要为大家详细介绍了C#调用USB摄像头的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

# C调用USB摄像头使用一个Forge类库进行开发,供大家参考,具体内容如下

1.安装一座桥

右键项目,在Manage NuGet package中搜索一个forge类库,选择Install,如下图所示。



2.封装USB摄像头。

a、初始化,初始化时需要注意的是,加载设备的分辨率需要手动配置,如果配置的分辨率不存在,需要从默认分辨率中选择。

videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);? if (videoDevices.Count gt; 0 amp;amp; videoDevices.Count gt;= CameraIndex)? ? ? ?{? ? ? ? FilterInfo info = videoDevices[videoDevices.Count - 1];? ? ? ? videoSource = new VideoCaptureDevice(info.MonikerString);? ? ? ? ? if (videoSource.VideoCapabilities.Length gt; 0)? ? ? ? ? ? {? ? ? ? ? ? ?VideoCapabilities tmp = videoSource.VideoCapabilities.? ? ? ? ? ? ? ?First(x =gt; x.FrameSize.Width == LocalSize.Width amp;amp;? ? ? ? ? ? ? ? ? ? ? ?x.FrameSize.Height == LocalSize.Height);? ? ? ? ? ? ? ? ? ?if (tmp != null)? ? ? ? ? ? ? ? ? ?{? ? ? ? ? ? ? ? ? ? videoSource.SnapshotResolution = tmp;? ? ? ? ? ? ? ? ? ? videoSource.VideoResolution = tmp;? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ?else? ? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? int index = (videoSource.VideoCapabilities.Length + 1) / 2;? ? ? ? ? ? ? ? ? ? tmp = videoSource.VideoCapabilities[index];? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? videoSourcePlayer.VideoSource = videoSource;? ? ? ? ? ? ? ? ? videoSourcePlayer.Start();? ? ? ? ? ? ? ? ? videoSource.NewFrame += new NewFrameEventHandler(Video_NewFrame);? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? catch (Exception ex)? ? ? ?{? ? ? ? LogHelper.Debug(ex);}

b、绑定回调方法,该方法会在相机预览成功后实时返回数据帧,封装时可以传入PictureBox,回调旋转后的图片会显示在该控件上。

private void Video_NewFrame(object sender, NewFrameEventArgs eventArgs)? ? ? ? {? ? ? ? ? ? try? ? ? ? ? ? {? ? ? ? ? ? ? ? Bitmap video = (Bitmap)eventArgs.Frame.Clone();? ? ? ? ? ? ? ? BmpRotate(video);? ? ? ? ? ? ? ? if (UsbVideo != null)? ? ? ? ? ? ? ? ? ? UsbVideo.Image = video;? ? ? ? ? ? }? ? ? ? ? ? catch (Exception ex)? ? ? ? ? ? {? ? ? ? ? ? ? ? LogHelper.Debug(ex);? ? ? ? ? ? }? ? ? ? }?? ? ? ? /// lt;summarygt;? ? ? ? /// 图像旋转? ? ? ? /// lt;/summarygt;? ? ? ? /// lt;param name="_bmp"gt;lt;/paramgt;? ? ? ? private void BmpRotate(Bitmap _bmp)? ? ? ? {? ? ? ? ? ? try? ? ? ? ? ? {? ? ? ? ? ? ? ? if (CameraRotate == "0")? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? else if (CameraRotate == "90")? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? _bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? else if (CameraRotate == "180")? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? _bmp.RotateFlip(RotateFlipType.Rotate180FlipNone);? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? else if (CameraRotate == "270")? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? _bmp.RotateFlip(RotateFlipType.Rotate270FlipNone);? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? ? ? catch (Exception ex)? ? ? ? ? ? {? ? ? ? ? ? ? ? LogHelper.Debug(ex);? ? ? ? ? ? }}

c、抓取图片事件,手动抓取图片事件,通过调用GetCurrentVideoFrame()方法获取位图图片。

public Bitmap GetCurrentVideoFrame()? ? ? {? ? ? ? ? ? Bitmap bmp = null;? ? ? ? ? ? try? ? ? ? ? ? {? ? ? ? ? ? ? ? bmp = videoSourcePlayer.GetCurrentVideoFrame();? ? ? ? ? ? ? ? BmpRotate(bmp);? ? ? ? ? ? }? ? ? ? ? ? catch (Exception ex)? ? ? ? ? ? {? ? ? ? ? ? ? ? LogHelper.Debug(ex);? ? ? ? ? ? }? ? ? ? ? ? return bmp;? ? ? ? }

D.重新连接摄像机。这个类库中有一个正在运行的属性,用来决定USB摄像头是否可以预览,设备是否可以重新连接。

private FilterInfoCollection videoDevices = null; //摄像头设备public VideoCaptureDevice videoSource = null; //视频的来源选择private VideoSourcePlayer videoSourcePlayer = new VideoSourcePlayer();public Bitmap img = null;public int CameraIndex = 1;? ? ? ? /// lt;summarygt;? ? ? ? /// 默认分辨率? ? ? ? /// lt;/summarygt;? ? ? ? public Size LocalSize = new Size(640, 480);? ? ? ? bool isHave = false;? ? ? ? public string CameraRotate = "0";? ? ? ? private System.Windows.Forms.PictureBox UsbVideo = null;? ? ? ? public void ReConnect()? ? ? ? {? ? ? ? ? ? try? ? ? ? ? ? {? ? ? ? ? ? ? ? if (!videoSourcePlayer.IsRunning)? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ?videoSource.Stop();? ? ? ? ? ? ? ? ? ?videoSource.Start();? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? ? ? catch (Exception)? ? ? ? ? ? {? ? ?}}

这就是本文的全部内容。希望对大家的学习有帮助,也希望大家能支持一下搜源网。


0

精彩评论

暂无评论...
验证码 换一张
取 消