「图像处理」C#+AForge.Net+DlibDotNet实现人脸识别

本文介绍如何使用C# WinForm结合AForge和DlibDotNet实现摄像头实时人脸识别,涵盖摄像头调用、图像处理及人脸识别方法。

折腾了两天才算是有点成果了。整理一下吧。

用C# WinForm开发,使用AForge调用摄像头,加上Dlib(DotNet)实现一下人脸识别

更新:现已经将代码,以及本文中所用到的DlibDotNetNative.dll、DlibDotNetNativeDnn.dll、DlibDotNet.Extensions.dll,以及人脸数据上传到github上,如有需要请自行下载。地址:https://github.com/RainkLH/Face_Detection_AForge-DlibDotNet

目录

1 AForge.Net调用摄像头

1.1 安装AForge.Net的依赖包

1.2 设计WinForm界面

1.3 添加代码

1.4 补充说明

1.4.1 关于VideoSourcePlayer 控件

1.4.2 关于拍照

2 添加人脸识别方法

2.1 安装DlibDotNet和人脸数据

2.2 人脸识别方法

2.3 人脸识别应用

3 遇到的坑

3.1 找不到【DlibDotNetNative.dll】和【DlibDotNetNativeDnn.dll】

3.2 图片转换:Bitmap->Array2D

3.3 图像转换抛异常


1 AForge.Net调用摄像头

1.1 安装AForge.Net的依赖包

操作摄像头需要用到【AForge.Video.DirectShow】。

从NuGet里查找进行安装,安装时会同时安装它的依赖项:【AForge.Video】和【AForge】

1.2 设计WinForm界面

界面如下:

 图中蓝色字体标注了我对每个控件的定义的ID,方便对应下文的代码

左边的【VideoSourcePlayer】控件(AForge中的控件)是摄像头的画面显示,右边的【PictureBox】是后面做人脸识别的显示框。

下方的【PictureBox】是拍照预览框。

期望是程序运行时,检测摄像头设备,添加到【coBox_camList】中,用户选择要用的相机设备,该设备所支持的分辨率自动添加到【coBox_Reslution】列表中,并自动选中默认分辨率,点击【打开】按钮即可显示摄像头画面并实时进行人脸检测。

1.3 添加代码

上面界面对应的代码(Form1.cs)如下:

//-----------form1.cs
using System;
using System.Drawing;
using System.Windows.Forms;
using AForge.Video;        //引用命名空间
using AForge.Video.DirectShow;        //引用命名空间

namespace AForgeCamera
{
    public partial class AForgeCamera : Form
    {
        private FilterInfoCollection CaptureDevices; //设备列表
        private VideoCaptureDevice captureDevice;  //摄像头设备
        private VideoCapabilities[] videoCapabilities;  //摄像头能力列表
        private VideoCapabilities videoCapabilitie;  //单一摄像头能力(分辨率等)


        public AForgeCamera()
        {
            InitializeComponent();
            //控件状态等初始化
            btn_cam.Enabled = false;
            btn_cam.Text = "打开";
            btn_takePic.Enabled = false;
            pBox_view.SizeMode = PictureBoxSizeMode.StretchImage;
            pBox_faceDst.SizeMode = PictureBoxSizeMode.StretchImage;
            //获取摄像头并添加到coBox_CamList
            CaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            foreach (FilterInfo filterInfo in CaptureDevices)
            {
                coBox_CamList.Items.Add(filterInfo.Name);
            }
            faceDetection = new FaceDetection();
        }

        private void AForgeCamera_FormClosing(object sender, FormClosingEventArgs e)
        {
            //主窗口关闭,必要的清理
            captureDevice.Stop();
            CaptureDevices.Clear();
            AVPlayer_Cam1.VideoSource = null;
            AVPlayer_Cam1.Stop();
        }

        private void coBox_CamList_SelectedIndexChanged(object sender, EventArgs e)
        {
            //选择摄像头后
            coBox_Resolution.Items.Clear(); //先清理上次选择的摄像头支持的分辨率
            //获取摄像头设备
            FilterInfo filterInfo = CaptureDevices[coBox_CamList.SelectedIndex];
            captureDevice = new VideoCaptureDevice(filterInfo.MonikerString);
            //获取所选择的摄像头分辨率列表并添加
            videoCapabilities = captureDevice.VideoCapabilities;
            foreach (VideoCapabilities capabilitie in videoCapabilities)
            {
                coBox_Resolution.Items.Add(capabilitie.FrameSize.Width.ToString() +
                "×" + capabilitie.FrameSize.Height.ToString());
            }
            //选中默认分辨率 触发coBox_Resolution_SelectedIndexChanged()
            if (coBox_Resolution.Items.Count > 0)
            {
                coBox_Resolution.SelectedIndex = 0;
            }
        }

        private void coBox_Resolution_SelectedIndexChanged(object sender, EventArgs e)
        {
            //获取选择的分辨率,选择时没有关闭摄像头时进行关闭
            videoCapabilitie = videoCapabilities[coBox_Resolution.SelectedIndex];
            btn_cam.Enabled = true;
   
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值