软件截图

 

项目截图

部分代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Nancy;
using NLog;
using System.Diagnostics;
using System.IO;
using System.Drawing;
using ArcFaceSDK.Entity;
using Newtonsoft.Json;
using ArcFaceSDK.SDKModels; namespace ArcSoftFaceService.Controller
{
public class ViewFaceModule : NancyModule
{
private Logger _log = NLog.LogManager.GetCurrentClassLogger(); private readonly static object _locker = new object(); public ViewFaceModule()
: base("/faceApi")
{
After.AddItemToEndOfPipeline((ctx) => ctx.Response
.WithHeader("Access-Control-Allow-Origin", "*")
.WithHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS")
.WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type")); Post["/faceRecognition"] = p =>
{
return FaceRecognizeByBase64();
};
} private dynamic FaceRecognizeByBase64()
{
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
AjaxReturn ar = new AjaxReturn();
ar.code = 0;
ar.message = "ok";
ar.similarity = 0; string ContentType = Request.Headers.ContentType;
string base64str = null;
string base64str2 = null; if (ContentType == "application/x-www-form-urlencoded")
{
base64str = Request.Form["zp1"];
base64str2 = Request.Form["zp2"];
}
else if (ContentType == "application/json")
{
string postData = Request.Body.AsString();
if (!string.IsNullOrEmpty(postData))
{
ReqPicParameter reqPic = JsonConvert.DeserializeObject<ReqPicParameter>(postData);
base64str = reqPic.zp1;
base64str2 = reqPic.zp2;
}
} if (string.IsNullOrEmpty(base64str))
{
ar.code = 0;
ar.message = "参数[zp1]不能为空";
}
else if (string.IsNullOrEmpty(base64str2))
{
ar.code = 0;
ar.message = "参数[zp2]不能为空";
}
else
{
try
{
//TODO 图片大小判断?? Image srcImage1 = StringToImage(base64str);
//调整图像宽度,需要宽度为4的倍数
if (srcImage1.Width % 4 != 0)
{
srcImage1 = ImageUtil.ScaleImage(srcImage1, srcImage1.Width - (srcImage1.Width % 4), srcImage1.Height);
} //人脸检测
MultiFaceInfo multiFaceInfo1;
int retCode = Program.imageEngine.ASFDetectFacesEx(srcImage1, out multiFaceInfo1);
if (retCode != 0)
{
ar.code = 0;
ar.message = "图像人脸检测失败,请稍后重试!";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} if (multiFaceInfo1.faceNum < 1)
{
ar.code = 0;
ar.message = "图片1未检测出人脸";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} if (multiFaceInfo1.faceNum >1)
{
ar.code = 0;
ar.message = "图片1检测出多张人脸";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} SingleFaceInfo singleFaceInfo1;
bool isMask1;
string faceFeatureStr1 = string.Empty;
FaceFeature feature1 = FaceUtil.ExtractFeature(Program.imageEngine
, srcImage1
, Program.thresholdImgNoMask
, Program.thresholdImgMask
, ASF_RegisterOrNot.ASF_RECOGNITION
, out singleFaceInfo1
, out isMask1
, ref faceFeatureStr1
, out retCode
, 0); if (feature1.featureSize == 0)
{
ar.code = 0;
ar.message = "图片1提取特征失败";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} //活体检测
int retCodeLiveness1 = -1;
LivenessInfo liveInfo1 = FaceUtil.LivenessInfo_RGB(Program.imageEngine, srcImage1, singleFaceInfo1, out retCodeLiveness1);
//活体检测结果
if (retCodeLiveness1.Equals(0) && liveInfo1.num > 0)
{
if (liveInfo1.isLive[0]!=1)
{
string livenessResult = CommonUtil.TransLivenessResult(liveInfo1.isLive[0]);
ar.code = 0;
ar.message = "图片1活体结果:" + livenessResult;
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} }
else
{
ar.code = 0;
ar.message = "图片1活体检测失败";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} Image srcImage2 = StringToImage(base64str2);
//调整图像宽度,需要宽度为4的倍数
if (srcImage2.Width % 4 != 0)
{
srcImage2 = ImageUtil.ScaleImage(srcImage2, srcImage2.Width - (srcImage2.Width % 4), srcImage2.Height);
} //人脸检测
MultiFaceInfo multiFaceInfo2;
int retCode2 = Program.imageEngine.ASFDetectFacesEx(srcImage2, out multiFaceInfo2);
if (retCode2 != 0)
{
ar.code = 0;
ar.message = "图像人脸检测失败,请稍后重试!";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} if (multiFaceInfo2.faceNum < 1)
{
ar.code = 0;
ar.message = "图片2未检测出人脸";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} if (multiFaceInfo2.faceNum > 1)
{
ar.code = 0;
ar.message = "图片2检测出多张人脸";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} SingleFaceInfo singleFaceInfo2;
bool isMask2;
string faceFeatureStr2 = string.Empty;
FaceFeature feature2 = FaceUtil.ExtractFeature(Program.imageEngine
, srcImage2
, Program.thresholdImgNoMask
, Program.thresholdImgMask
, ASF_RegisterOrNot.ASF_RECOGNITION
, out singleFaceInfo2
, out isMask2
, ref faceFeatureStr2
, out retCode2
, 0); if (feature2.featureSize == 0)
{
ar.code = 0;
ar.message = "图片2提取特征失败";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} //活体检测
int retCodeLiveness2 = -1;
LivenessInfo liveInfo2 = FaceUtil.LivenessInfo_RGB(Program.imageEngine, srcImage2, singleFaceInfo2, out retCodeLiveness2);
//活体检测结果
if (retCodeLiveness2.Equals(0) && liveInfo2.num > 0)
{
if (liveInfo2.isLive[0] != 1)
{
string livenessResult = CommonUtil.TransLivenessResult(liveInfo2.isLive[0]);
ar.code = 0;
ar.message = "图片2活体结果:" + livenessResult;
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
}
}
else
{
ar.code = 0;
ar.message = "图片2活体检测失败";
ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} float similarity = 0f;
Program.imageEngine.ASFFaceFeatureCompare(feature1, feature2, out similarity, Program.compareModel);
//增加异常值处理
if (similarity.ToString().IndexOf("E") > -1)
{
similarity = 0f;
} ar.code = 1;
ar.similarity = similarity;
ar.message = "ok"; srcImage1.Dispose();
srcImage2.Dispose();
}
catch (Exception ex)
{
ar.code = 0;
ar.message = "识别异常:" + ex.Message;
} } ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
_log.Info(JsonConvert.SerializeObject(ar));
sw.Stop();
return Response.AsJson<AjaxReturn>(ar);
} public Bitmap ByteToImage(byte[] bytes)
{
if (bytes == null)
{
return null;
}
using (MemoryStream ms = new MemoryStream(bytes))
{
Bitmap bmp = new Bitmap(ms);
SaveBitMap(bmp);
ms.Close();
return bmp;
}
} public bool SaveBitMap(Bitmap bmp)
{
if (Program.saveImg == "0")
{
return true;
} try
{
string path = System.Windows.Forms.Application.StartupPath + "\\img";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filename = path + "\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mmssffff") + ".jpeg";
bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);//保存到服务器路径
return true;
}
catch (Exception e)
{
_log.Error("SaveBitMap 保存图片出错", e);
return false;
}
} /// <summary>
/// base64编码的文本转为图片
/// </summary>
/// <param name="inputStr"></param>
/// <returns></returns>
public Bitmap StringToImage(string inputStr)
{
if (string.IsNullOrEmpty(inputStr))
{
return null;
}
byte[] arr = Convert.FromBase64String(inputStr.Trim());
using (MemoryStream ms = new MemoryStream(arr))
{
Bitmap bmp = new Bitmap(ms);
SaveBitMap(bmp);
ms.Close();
return bmp;
}
} }
}

代码下载

C#人脸对比服务(基于虹软人脸识别SDKV4.1封装)的更多相关文章

  1. 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)

    前言 大家应该都知道几个很常见的例子,比如在张学友的演唱会,在安检通道检票时,通过人像识别系统成功识别捉了好多在逃人员,被称为逃犯克星:人行横道不遵守交通规则闯红灯的路人被人脸识别系统抓拍放在大屏上以 ...

  2. 基于node.js人脸识别之人脸对比

    基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...

  3. 记C# 调用虹软人脸识别 那些坑

    上一个东家是从事安防行业的,致力于人工智能领域,有自主人脸识别.步态识别的算法.C++同事比较称职有什么问题都可以第一时间反馈,并得到合理的处理,封装的DLL 是基于更高性能的GPU算法,可支持更多线 ...

  4. 虹软人脸识别SDK接入Milvus实现海量人脸快速检索

    一.背景 人脸识别是近年来最热门的计算机视觉领域的应用之一,而且现在已经出现了非常多的人脸识别算法,如:DeepID.FaceNet.DeepFace等等.人脸识别被广泛应用于景区.客运.酒店.办公室 ...

  5. Android打开相机进行人脸识别,使用虹软人脸识别引擎

    上一张效果图,渣画质,能看就好 功能说明: 人脸识别使用的是虹软的FreeSDK,包含人脸追踪,人脸检测,人脸识别,年龄.性别检测功能,其中本demo只使用了FT和FR(人脸追踪和人脸识别),封装了开 ...

  6. Android 关于虹软人脸识别SDK引擎使用总结

    虹软 最近开放了人脸识别的SDK引擎(免费的哦),刚好有Android版的,就体验了一波.下面来说说Android版的SDK使用心得: ArcFace 虹软人脸认知引擎简介 目前开放的版本有人脸比对( ...

  7. 在nodejs中的集成虹软人脸识别

    ==虹软官网地址==http://www.arcsoft.com.cn 在官网注册账号,并且申请人脸识别激活码, 选择SDK版本和运行系统(windows/linux/android/ios) ,我们 ...

  8. 虹软人脸识别 - Android Camera实时人脸追踪画框适配

    在使用虹软人脸识别Android SDK的过程中 ,预览时一般都需要绘制人脸框,但是和PC平台相机应用不同,在Android平台相机进行应用开发还需要考虑前后置相机切换.设备横竖屏切换等情况,因此在人 ...

  9. 虹软人脸识别Android Sample Code

    AFR_FSDKInterface engine = new AFR_FSDKEngine(); //用来存放提取到的人脸信息, face_1 是注册的人脸,face_2 是要识别的人脸 AFR_FS ...

  10. 虹软人脸识别iOS SDK2.0

    最近公司要在APP上添加一个人脸识别功能,在网上搜了一圈,发现虹软的人脸识别SDK挺好用的,而且还免费,所以就下载了他们的SDK研究了一下.总的来看功能挺好用的,只是demo上面部分功能不是很完善,所 ...

随机推荐

  1. Java集合框架学习(十三) Collections类详解

    Collections类介绍 这个类操作或返回集合的专有静态方法. 它包含多态算法,利用wrappers(封装器)返回指定集合类型的新集合,以及其他一些零散功能. 如果该类的方法引用的集合或类对象为n ...

  2. 用Taro写一个微信小程序——版本升级

    一.升级 1.升级Taro CLI至最新版本 taro update self npm i -g @tarojs/cli 2.更新项目中 Taro 相关的依赖 taro update project ...

  3. 项目实战:Qt + 树莓派3B+ 智能笔筒系统

    红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术.树莓派.三维.OpenCV.OpenGL.ffmpeg.OSG.单片机.软硬结合等等)持续更新中-(点击传送门)   需求   1.基于树莓 ...

  4. 协程与yield表达式

    在函数内,yield语句可以作为表达式使用,出现在赋值运算符的右边,例如: def receiver(): print("Ready to receive") while True ...

  5. 安装SQL Server 具有不支持的属性(Compressed)集。

    安装sqlserver 2014报错信息 D:\Program Files\Microsoft SQL Server 具有不支持的属性(Compressed)集.请通过使用文件夹属性对话框从该文件夹中 ...

  6. Xilinx GTH 简介 ,CoaXpress FPGA PHY 部分

    什么是GTH GTH 是Xilinx UltraScale系列FPGA上高速收发器的一种类型,本质上和其它名称如GTP, GTX等只是器件类型不同.速率有差异:GTH 最低速率在500Mbps,最高在 ...

  7. 看看这份2023年MySQL终级面试题,提升你的内力,给你面试助力

    1.MySQL 中有哪几种锁? (1)表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最 高,并发度最低. (2)行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最 ...

  8. 【Azure 媒体服务】Azure Media Service上传的视频资产,如何保证在Transfer编码后音频文件和视频文件不分成两个文件?保持在一个可以直接播放的MP4文件中呢?

    问题描述 Azure Media Service上传的视频资产,如何保证在Transfer编码后音频文件和视频文件不分成两个文件?保持在一个可以直接播放的MP4文件中呢? 问题解答 Azure Med ...

  9. 【Azure 事件中心】EventHub 中同一条消息不停的推送给消费端问题记录

    问题描述 EventHub 中同一条消息,不停的推送给消费端,查看日志发现错误: Caused by: com.azure.messaging.eventhubs.implementation.Par ...

  10. 【Azure 环境】Azure 的PaaS服务如果涉及到安全漏洞问题后,我们如何确认所用服务的实例(VM:虚拟机)的操作系统已修复该补丁呢?

    问题描述 如上图中PaaS所不可见区域, 操作系统级别的内容我们并不知道具体的内容.如果当出现新的操作系统级别的安全漏洞时候,我们如何来确认当前所使用的Azure PaaS服务所在主机的OS已经修复了 ...