C# 使用aforge.net调用本地摄像头画面和抓拍图片

在日常开发过程中,c#调用本地摄像头由很多种方式可以实现,今天我们就来讲一下如何通过Aforge图像处理库来调用本地摄像头并实现抓拍功能。
首先,我们新建一个空白的Winform程序,在Nuget包管理器中搜索Aforge,会出现很多结果,其中安装AForge.Video.DirectShowAForge.Controls两个库即可。
c#安装Aforge
AForge.Video.DirectShowAForge.Controls两个库安装好以后,我们先生成一下项目目的是确保Aforge自定义控件能够正确地添加到VS控件工具箱中,如下图所示
c#Aforge自定义控件
最后我们开始实现代码逻辑,先全局定义FilterInfoCollectionVideoCaptureDeviceVideoCapabilities三个变量,然后具体代码流程如下。

  • 在窗体加载Load事件时,扫描摄像头信息并显示在下拉列表中。
  • 切换摄像头列表时根据选中的摄像头信息获取支持的分辨率列表
  • 点击连接按钮开始连接指定摄像头,并把摄像头画面显示在控件中
  • 点击抓拍按钮获取摄像头画面当前帧保存到程序根目录
  • 点击断开连接按钮断开与摄像头的连接

至此整个代码逻辑梳理完毕,下面附上Aforge调用摄像头示例代码

using AForge.Video.DirectShow;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AforgeExp
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private FilterInfoCollection videoDevices;
        private VideoCaptureDevice videoDevice;
        private VideoCapabilities[] videoCapabilities;

        private void FrmMain_Load(object sender, EventArgs e)
        {
            //获取内置、外接摄像头,非网络摄像头
            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (videoDevices.Count != 0)
            {
                foreach (FilterInfo device in videoDevices)
                {
                    cbo_camera.Items.Add(device.Name);
                }
            }
            else
            {
                cbo_camera.Items.Add("没有找到摄像头");
            }

            cbo_camera.SelectedIndex = 0;
        }

        private void cbo_camera_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (videoDevices.Count != 0)
            {
                //获取每个摄像头支持的分辨率
                videoDevice = new VideoCaptureDevice(videoDevices[cbo_camera.SelectedIndex].MonikerString);
                GetDeviceResolution(videoDevice);
            }
        }

        /// <summary>
        /// 获取每个摄像头支持的分辨率
        /// </summary>
        /// <param name="videoCaptureDevice"></param>
        private void GetDeviceResolution(VideoCaptureDevice videoCaptureDevice)
        {
            cbo_rate.Items.Clear();
            videoCapabilities = videoCaptureDevice.VideoCapabilities;
            foreach (VideoCapabilities capabilty in videoCapabilities)
            {
                cbo_rate.Items.Add($"{capabilty.FrameSize.Width} x {capabilty.FrameSize.Height}");
            }
            cbo_rate.SelectedIndex = 0;
        }

        private void btn_conn_Click(object sender, EventArgs e)
        {
            if (videoDevice != null)
            {
                if ((videoCapabilities != null) && (videoCapabilities.Length != 0))
                {
                    videoDevice.VideoResolution = videoCapabilities[cbo_rate.SelectedIndex];

                    myvideo.VideoSource = videoDevice;
                    myvideo.Start();

                    btn_conn.Enabled = false;
                    btn_stop.Enabled = true;
                    btn_cap.Enabled = true;
                }
            }
        }

        private void btn_stop_Click(object sender, EventArgs e)
        {
            if (myvideo.VideoSource != null)
            {
                myvideo.SignalToStop();
                myvideo.WaitForStop();
                myvideo.VideoSource = null;

                btn_conn.Enabled = true;
                btn_stop.Enabled = false;
                btn_cap.Enabled = false;
            }
        }

        private void btn_cap_Click(object sender, EventArgs e)
        {
            if (myvideo.VideoSource != null)
            {
                Bitmap img = myvideo.GetCurrentVideoFrame();
                img.Save("001.jpg");
                MessageBox.Show("抓拍成功,文件在程序根目录下。");
            }
        }

        /// <summary>
        /// 窗体关闭程序退出时断开摄像头连接
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (myvideo.VideoSource != null)
            {
                myvideo.SignalToStop();
                myvideo.WaitForStop();
                myvideo.VideoSource = null;

                btn_conn.Enabled = true;
                btn_stop.Enabled = false;
                btn_cap.Enabled = false;
            }
        }
    }
}

最后附上示例文章中的源代码下载地址: AforgeExp.zip (访问密码: 7831)

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: AForge.NET是一个开放源代码的计算机视觉和人工智能框架。它提供了一系列功能强大的工具和算法,用于图像处理、机器学习、机器视觉和模式识别等领域。在AForge.NET中,也可以使用其提供的工具和算法进行条码识别。 条码识别是通过对图像进行分析和处理,解码出条码中存储的信息。AForge.NET提供了用于条码识别的类库和方法。 首先,可以使用AForge.NET中的图像处理工具对图像进行预处理,例如灰度化、二值化等操作,以提高条码识别的准确性。 其次,AForge.NET中的条码识别方法可以对预处理后的图像进行分析和解码。它支持多种常见的1D和2D条码类型,例如EAN-13、QR码等。 最后,可以通过AForge.NET提供的接口将条码识别结果集成到自己的应用程序中。可以根据需要,将识别结果作为文本、数字等形式进行处理和展示,以满足不同的应用需求。 总之,AForge.NET是一个功能强大的框架,可以用于多个领域的图像处理和模式识别任务,包括条码识别。使用AForge.NET进行条码识别可以通过预处理图像和解码条码信息来实现。 ### 回答2: AForge.NET是一个开源的计算机视觉和人工智能框架,它提供了一个用于图像处理和分析的强大工具集。在AForge.NET中,也包含了用于条码识别的功能。 使用AForge.NET进行条码识别可以通过以下几个步骤完成: 1. 导入AForge.NET库:在使用AForge.NET进行条码识别之前,需要首先导入相应的库文件。可以从AForge.NET官方网站下载最新版本的库文件并添加到项目中。 2. 选择适当的条码识别算法:AForge.NET提供了多种条码识别算法,例如一维条码识别(如Code39、Code128)和二维条码识别(如QR码、Data Matrix)。用户可以根据需要选择适当的算法。 3. 预处理图像:在进行条码识别之前,通常需要对图像进行预处理,以提高识别准确率。预处理步骤可能包括灰度化、降噪、二值化等操作。 4. 执行条码识别:使用选定的条码识别算法,对预处理后的图像进行条码识别。AForge.NET提供了相应的函数和方法来实现这一步骤。识别结果通常包括条码的类型和解码后的数据。 5. 处理识别结果:根据需要,可以进一步处理识别结果,例如将解码后的数据展示给用户或进行进一步的处理操作。 综上所述,AForge.NET是一个强大的计算机视觉框架,它提供了丰富的功能来进行条码识别。用户可以根据自己的需求选择适当的条码识别算法,并使用AForge.NET提供的函数和方法来实现条码识别。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值