C# 调用USB摄像头

目录

C#调用USB摄像头使用AForge类库进行开发

1、AForge安装

2、下载完毕后进行USB摄像头类封装


C#调用USB摄像头使用AForge类库进行开发

1、AForge安装

右击工程,在管理NuGet程序包中搜索Aforge类库,选择安装,如下图所示

2、进行USB摄像头类封装

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

                videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                if (videoDevices.Count > 0 && videoDevices.Count >= CameraIndex)
                {
                    FilterInfo info = videoDevices[videoDevices.Count - 1];
                    videoSource = new VideoCaptureDevice(info.MonikerString);
                    if (videoSource.VideoCapabilities.Length > 0)
                    {
                        VideoCapabilities tmp = videoSource.VideoCapabilities.
                            First(x => x.FrameSize.Width == LocalSize.Width &&
                                       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);
            }
        }

        /// <summary>
        /// 图像旋转
        /// </summary>
        /// <param name="_bmp"></param>
        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()方法获取Bitmap图片

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

d、摄像头重连,此类库中videoSourcePlayer有个属性IsRunning可以判断是否USB摄像头预览中,可以对设备进行重连

        private FilterInfoCollection videoDevices = null; //摄像头设备
        public VideoCaptureDevice videoSource = null; //视频的来源选择
        private VideoSourcePlayer videoSourcePlayer = new VideoSourcePlayer();
        public Bitmap img = null;
        public int CameraIndex = 1;
        /// <summary>
        /// 默认分辨率
        /// </summary>
        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)
            {
            }
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冀石程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值