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#使用正则表达式匹配字符串验证URL示例

    下面是详细讲解c#使用正则表达式匹配字符串验证URL的完整攻略。 什么是正则表达式 正则表达式是一种用于匹配文本的工具,它可以用来查找、替换或者检测文本中符合特定格式的字符串。 在c#中,.NET框架提供了使用正则表达式的类库,通过这些类库可以方便的进行字符串匹配的操作。 如何使用正则表达式匹配URL 在c#中,我们可以使用Match类提供的方法来进行正则表…

    C# 2023年6月8日
    00
  • C#条件拼接Expression<Func<T, bool>>的使用

    C#条件拼接(Expression)是一种在运行时动态拼接查询条件的语法,可以在不知道查询条件组合的情况下进行条件组合,极大提高了代码的可复用性和可维护性。 使用条件拼接需要引入System.Linq.Expressions命名空间。 一般情况下,我们需要根据参数的不同来组合不同的查询条件,比如以下示例: public List<T> Query…

    C# 2023年6月3日
    00
  • C#中的timer与线程使用

    C#中的timer和线程是常用的多线程编程方式,可以实现定时任务、异步操作等。下面是完整攻略: Timer 1. Timer的使用方法 Timer是一个C#中轻量级的计时器。使用时需要先创建一个Timer对象,传入一个TimerCallback委托作为回调函数,在指定时间间隔后,每次调用回调函数。常用的构造函数有: public Timer(TimerCal…

    C# 2023年6月1日
    00
  • 通用的CRUD之LiteDB

    前言 你要开发一个系统,是不是首要任务是先建库,建表,建字段,既所谓的数据建模(听起来高大上一点,数据建模也确实是个烧脑的活),要费不少功夫。不知你是否遇到过这样的场景。A产品有3个测试参数,B产品有6个测试参数,而且值和类型都各不相同,用SQL你要怎么建表呢?有人会说这简单“参数名,参数值两列搞定”,NO!数据类型考虑了吗,数据量考虑了吗?有人又说”每个参…

    C# 2023年5月10日
    00
  • C# AddRange(ICollection):将 ICollection 中的元素添加到集合中

    C#中的AddRange方法用于将一个集合的元素添加到另一个集合中。其定义如下: public void AddRange(ICollection collection) 可以看到,它接受一个ICollection类型的参数,也就是说可以接收任何实现ICollection接口的类的对象,比如List、HashSet、Queue等等。 具体使用方法如下: Li…

    C# 2023年4月19日
    00
  • swagger配置正式环境中不可访问的问题

    当我们在开发阶段使用Swagger来管理我们的REST API时,它对于我们进行API测试、API文档编写非常友好。但是在发布到正式环境时,我们需要注意以下几点,避免Swagger配置的API在正式环境中被未经授权的用户访问。 1. 在生产环境中禁用Swagger UI Swagger UI是Swagger的一个核心组件,它用于在浏览器中呈现API文档,并提…

    C# 2023年5月15日
    00
  • Unity实现物体左右移动效果

    Unity是一款流行的游戏开发引擎,它可以实现许多游戏功能包括制作物体左右移动效果。下面将详细讲解Unity实现物体左右移动效果的完整攻略。 实现方式 在Unity中实现物体左右移动的基本方式是通过脚本在Update函数中改变物体的位置。因此,我们需要找到需要移动的对象,创建一个用于移动的脚本,并在脚本的Update函数中修改物体的位置。 1. 创建控制脚本…

    C# 2023年6月3日
    00
  • C# Socket实现简单控制台案例

    C#是一种流行的编程语言,被广泛用于网络编程。其中,C# Socket是一种常见的网络编程库,我们可以通过 Socket 实现网络通信。下面是关于如何通过 C# Socket 实现控制台案例的完整攻略。 第一步:引入命名空间 在开始之前,需要引入命名空间 System.Net.Sockets 和 System.Text,以便我们使用 C# Socket 编程…

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