C#版免费离线人脸识别之虹软ArcSoft V3.0(推荐)

C#版免费离线人脸识别之虹软ArcSoft V3.0(推荐)是一款完全开源免费的人脸识别程序,使用者可以在本地环境下运行,不需要联网即可进行人脸识别。下面是详细的使用攻略。

1. 安装ArcSoft SDK

首先,在官网下载并安装ArcSoft SDK,根据自己的操作系统版本选择相应的SDK安装包,可以在ArcSoft官网的开发者中心下载:

http://www.arcsoft.com.cn/developer/

下载完成后,双击安装包,按提示进行安装即可。

2. 设置环境变量

安装完成后,需要将SDK的bin目录添加到环境变量中。在Windows系统中,可以通过以下步骤进行设置:

  1. 右键点击“计算机”,选择“属性”;
  2. 点击左侧的“高级系统设置”;
  3. 在“高级”选项卡中,点击“环境变量”;
  4. 在“系统变量”中找到“Path”变量,点击“编辑”;
  5. 在弹出的“编辑环境变量”窗口中,点击“新建”按钮,输入SDK的bin目录路径,例如:D:\arcsoft-sdk\bin;
  6. 点击“确定”按钮,保存设置并关闭窗口。

3. 下载并运行示例代码

下载 C#版免费离线人脸识别之虹软ArcSoft V3.0(推荐)的示例代码:https://github.com/wgdxy/ArcFaceDemo_CSharp

解压缩后运行 AFDemo.sln,打开 AFDemo 项目。将项目中 App.config 中的 APPID 、SDKKEY 和 LIBRARY_PATH 替换成你自己的。你可以在官网注册账号并创建应用获取 APPID 和 SDKKEY。LIBRARY_PATH 替换成SDK中的人脸库路径。

4. 运行示例程序测试人脸识别功能

在运行示例程序前,请确保已经安装摄像头或者USB摄像头,并连接正常。

在运行示例程序时,可以通过按下空格键来进行人脸识别。程序将会识别摄像头抓取到的人脸图像,并显示检测到的人脸数量、位置、角度、性别、年龄等信息。可以通过按下Esc键退出程序。

示例1:人脸检测示例

int errorCode = 0;

AFD_FSDK_Version version = new AFD_FSDK_Version();
IntPtr pVersion = Marshal.AllocHGlobal(Marshal.SizeOf(version));
Marshal.StructureToPtr(version, pVersion, false);

errorCode = AFD_FSDK_InitialFaceEngine(AppData._APPID, AppData._FD_SDKKEY, pFDEngine, AFD_FSDK_OPF_0_HIGHER_EXT, 16, 5);
CheckError(errorCode);
errorCode = AFD_FSDK_GetVersion(pFDEngine, pVersion);
CheckError(errorCode);
version = (AFD_FSDK_Version)Marshal.PtrToStructure(pVersion, typeof(AFD_FSDK_Version));
Console.WriteLine("##### AFD_FSDK_GetVersion:{0}.{1}.{2}.{3}", version.lCodebase, version.lMajor, version.lMinor, version.lBuild);
Console.WriteLine("##### AFD_FSDK_GetVersion: "+ Marshal.PtrToStringAnsi(version.Version));

示例2:人脸识别并裁剪处理示例

AFD_FSDK_Version version = new AFD_FSDK_Version();
IntPtr pVersion = Marshal.AllocHGlobal(Marshal.SizeOf(version));
Marshal.StructureToPtr(version, pVersion, false);
APL_FSDK_Version version1 = new APL_FSDK_Version();
IntPtr pVersion1 = Marshal.AllocHGlobal(Marshal.SizeOf(version1));
Marshal.StructureToPtr(version1, pVersion1, false);

errorCode = AFD_FSDK_InitialFaceEngine(AppData._APPID, AppData._FD_SDKKEY, pFDEngine, AFD_FSDK_OPF_0_HIGHER_EXT, 16, 1);
CheckError(errorCode);
errorCode = AFD_FSDK_GetVersion(pFDEngine, pVersion);
CheckError(errorCode);
version = (AFD_FSDK_Version)Marshal.PtrToStructure(pVersion, typeof(AFD_FSDK_Version));
Console.WriteLine("##### AFD_FSDK_GetVersion:{0}.{1}.{2}.{3}", version.lCodebase, version.lMajor, version.lMinor, version.lBuild);
Console.WriteLine("##### AFD_FSDK_GetVersion: "+ Marshal.PtrToStringAnsi(version.Version));

errorCode = AFR_FSDK_InitialEngine(AppData._APPID, AppData._FR_SDKKEY, pFREngine, AFR_FSDK_OPF_0_HIGHER_EXT, 16, 1);
CheckError(errorCode);
errorCode = AFR_FSDK_GetVersion(pFREngine, pVersion1);
CheckError(errorCode);
version1 = (APL_FSDK_Version)Marshal.PtrToStructure(pVersion1, typeof(APL_FSDK_Version));
Console.WriteLine("##### AFR_FSDK_GetVersion:{0}.{1}.{2}.{3}", version1.lCodebase, version1.lMajor, version1.lMinor, version1.lBuild);
Console.WriteLine("##### AFR_FSDK_GetVersion: " + Marshal.PtrToStringAnsi(version1.Version));

int cameraIndex = 0;
for (int i = 0; i < CameraNames.Length; i++)
{
    if (CameraNames[i] == AppData._CameraName)
    {
        cameraIndex = i;
        break;
    }
}
//连接摄像头
cap = new Capture(cameraIndex);

//得到视频源
fps = (int)cap.GetCaptureProperty(CapProp.Fps);
frameWidth = (int)cap.GetCaptureProperty(CapProp.FrameWidth);
frameHeight = (int)cap.GetCaptureProperty(CapProp.FrameHeight);

while (InvokeFlag)
{
    //Capture a Image
    frame = cap.QueryFrame();

    //镜像变换
    Cv2.Flip(frame, frame, FlipMode.Y);

    //处理图象
    if (frame.Cols > 0 && frame.Rows > 0)
    {
        IntPtr ImageData = Marshal.AllocHGlobal(frame.Width * frame.Height * 3);
        AFT_FSDK_FACERES faceResult = new AFT_FSDK_FACERES();
        // 顔檢出
        IntPtr pImage = Marshal.AllocHGlobal(frame.Width * frame.Height * 3);
        Cv2.CvtColor(frame, frame, ColorConversionCodes.BGR2RGB);
        DataConverter.DataConverter.BufferToImageData(frame.ToBytes(), frame.Width, frame.Height, ImageData);
        errorCode = AFT_FSDK_FaceFeatureDetect(pFDEngine, frame.Width, frame.Height, AFT_FSDKEngine.CP_PAF_NV21, ImageData, ref faceResult);
        Marshal.FreeHGlobal(pImage);
        if (errorCode == 0)
        {
            FaceRect[] rects = new FaceRect[faceResult.nFace];
            for (int i = 0; i < rects.Length; i++)
            {
                rects[i] = (FaceRect)Marshal.PtrToStructure(faceResult.rcFace + Marshal.SizeOf(typeof(FaceRect)) * i, typeof(FaceRect));
            }
            // 顔認識測
            int[] deepFeatures = new int[AppData._MaxFaceCount * 2];
            float[] scores = new float[AppData._MaxFaceCount];
            IntPtr faceResultPtr = Marshal.AllocHGlobal(faceResult.nFace * Marshal.SizeOf(typeof(AFR_FSDK_FACEINPUT)));
            AFR_FSDK_FACEINPUT[] faceInput = new AFR_FSDK_FACEINPUT[faceResult.nFace];
            for (int i = 0; i < faceResult.nFace; i++)
            {
                byte[] data = new byte[rects[i].Width * rects[i].Height * 3];
                int width = (int)(rects[i].Width + 3) & ~3;
                int height = (int)(rects[i].Height + 1) & ~1;
                byte[] cropData = new byte[width * height * 3 / 2];
                DataConverter.DataConverter.ImageDataToBuffer(ImageData + rects[i].Y * frame.Width * 3 + rects[i].X * 3, frame.Width * 3, width, height,
                        cropData, width * 3, AFT_FSDKEngine.CP_PAF_RGB24_B8G8R8);
                DataConverter.DataConverter.RGB24ImageToNV21(cropData, width, height, data);
                faceInput[i].lOrient = faceResult.lfaceOrient[i];
                faceInput[i].rcFace.left = 0;
                faceInput[i].rcFace.top = 0;
                faceInput[i].rcFace.right = width;
                faceInput[i].rcFace.bottom = height;
                faceInput[i].pbFeature = Marshal.AllocHGlobal(AFR_FSDK_FACEFEATURE.FeatureSize);
                Marshal.Copy(Marshal.AllocHGlobal(AFR_FSDK_FACEFEATURE.FeatureSize).ToInt32() - AFR_FSDK_FACEFEATURE.FeatureSize, deepFeatures, i * 2, 2);
                faceInput[i].lFeatureSize = deepFeatures[i * 2 + 1];
                errorCode = AFR_FSDK_ExtractFRFeature(pFREngine, data, width, height, AFR_FSDKEngine.CP_PAF_NV21, ref faceInput[i], ref deepFeatures[i * 2]);
                if (errorCode != 0)
                {
                    Marshal.FreeHGlobal(faceInput[i].pbFeature);
                    faceInput[i].pbFeature = IntPtr.Zero;
                }
                Marshal.StructureToPtr(faceInput[i], faceResultPtr + Marshal.SizeOf(typeof(AFR_FSDK_FACEINPUT)) * i, false);
            }
            errorCode = AFR_FSDK_FacePairMatching(pFREngine, faceResultPtr, faceResult.nFace, deepFeatures, scores);
            for (int i = 0; i < faceResult.nFace; i++)
            {
                if (scores[i] < AppData._Threshold)
                {
                    Cv2.Rectangle(frame, new OpenCvSharp.Rect(rects[i].Left, rects[i].Top, rects[i].Width, rects[i].Height), new Scalar(0, 255, 0));
                    Cv2.PutText(frame, "Unknown", new Point(rects[i].Left, rects[i].Top), HersheyFonts.HersheyComplex, 1, new Scalar(0, 255, 0), 2, LineTypes.Link8, false);
                }
                else
                {
                    string name = System.Web.HttpUtility.UrlDecode(AppData._FaceDbMatch.FindNameByFeature(deepFeatures, i, ref scores[i]), System.Text.Encoding.UTF8);
                    Cv2.Rectangle(frame, new OpenCvSharp.Rect(rects[i].Left, rects[i].Top, rects[i].Width, rects[i].Height), new Scalar(0, 0, 255));
                    Cv2.PutText(frame, name, new Point(rects[i].Left, rects[i].Top), HersheyFonts.HersheyComplex, 1, new Scalar(0, 0, 255), 2, LineTypes.Link8, false);
                }
                if (faceInput[i].pbFeature != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(faceInput[i].pbFeature);
                }
            }
            Marshal.FreeHGlobal(faceResultPtr);
        }
        else
        {
            Console.WriteLine("error code: " + errorCode);
        }
        Marshal.FreeHGlobal(ImageData);
    }
    //显示当前图象
    try
    {
        videoImage.Dispatcher.Invoke(new ShowImageDelagate(ShowImage), frame.ToBitmapSource());
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#版免费离线人脸识别之虹软ArcSoft V3.0(推荐) - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C# 实现特殊字符快速转码

    下面是 “C# 实现特殊字符快速转码”的完整攻略。 1. 简介 在我们的开发过程中,经常要用到一些特殊字符如“<”,“>”,“&”等,但是这些字符在 HTML 网页中是有特殊含义的,而我们又不希望这些字符会影响网页的显示。为了解决这一问题,我们可以将这些特殊字符进行转义操作,即将其转化为特定的实体字符,以防止其在 HTML 中的意外转换。…

    C# 2023年5月31日
    00
  • c#文件助手类分享(读取文件内容 操作日志文件)

    c#文件助手类分享(读取文件内容 操作日志文件) 在C#编程中,文件读写操作是非常常见的任务。为了方便操作文件,可以使用文件助手类。本攻略将详细介绍C#文件助手类的使用方法。 一、引用命名空间 首先需要引用System.IO命名空间,因为文件操作均需要使用这个命名空间中的类和方法。 using System.IO; 二、读取文件内容 1. 读取文本文件内容 …

    C# 2023年6月1日
    00
  • C# using语法糖图文详解

    C#的using语法糖是一种方便管理资源的方法。它在代码块的开头定义资源,并在代码块结束时自动释放资源。该语法糖通常用于处理文件、网络连接、数据库连接和其它需要及时释放资源的对象。 定义和语法 using语法糖定义一个代码块,在该代码块开始处创建所需的资源,并在结束处释放资源。语法如下: using (resource) { // code } resour…

    C# 2023年5月31日
    00
  • .Net Core SDK命令介绍及使用

    .Net Core SDK命令介绍及使用 在使用.Net Core开发应用程序时,我们需要使用.Net Core SDK命令来完成各种任务,例如创建项目、编译代码、运行应用程序等。本攻略将详细介绍.Net Core SDK命令的使用方法,并提供两个示例说明。 常用命令 以下是一些常用的.Net Core SDK命令: dotnet new:创建新项目或文件。…

    C# 2023年5月16日
    00
  • C#使用async和await实现异步编程

    下面是C#使用async和await实现异步编程的完整攻略。 什么是异步编程? 异步编程是指同时执行多个操作,而且不用等待当前操作完成再去执行下一个操作的编程方式。使用异步编程可以在所有操作都完成之前充分利用资源,提高性能和效率。 C#异步编程的实现方式 在C#中,异步编程可以使用async和await关键字实现。async关键字用于修饰方法,表明该方法是异…

    C# 2023年5月15日
    00
  • mvc开启gzip压缩示例分享

    下面是关于MVC开启Gzip压缩的完整攻略: MVC开启Gzip压缩 什么是Gzip? Gzip是一种文件压缩格式,在网络传输中被广泛应用。GZip将传输的原始文本压缩成更小的数据,减少了网络传输数据量从而提升了网站的载入速度。 如何在MVC中开启Gzip压缩? 在MVC中开启Gzip压缩需要做如下几个步骤: 引入NuGet包 首先需要在项目中引入Micro…

    C# 2023年5月15日
    00
  • WinForm项目开发中NPOI用法实例解析

    WinForm项目开发中NPOI用法实例解析 在WinForm项目开发过程中,Excel文件的读写是一个常见的需求。NPOI是一个.NET下的开放源代码Excel读写库,可以很好地实现WinForm应用中Excel文件的读取和写入,下面是NPOI用法的实例解析。 步骤1:引用NPOI库 NPOI库可以从NuGet上引用或者在官网上下载后手动添加。如果使用Nu…

    C# 2023年6月7日
    00
  • C#静态方法的使用

    下面是详细讲解 “C# 静态方法的使用” 的完整攻略。 什么是静态方法 在 C# 中,静态方法是一种只属于类的方法,而不属于类的任何实例(对象)。静态方法可以直接通过类名调用,不需要先实例化一个对象。因此,静态方法通常被用作工具方法,例如 Math 类中的 Pow() 方法。 怎样使用静态方法 使用静态方法的语法格式为: [访问修饰符] static 返回类…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部