【C#】arcface人脸识别使用问题分析
arcface上线了新版 正好有空 赶紧下载体验了一番 凡是过程中也遇到一些问题
1.初始化
[DllImport("libarcsoft_face_engine.dll", EntryPoint = "ASFInitEngine", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern int ASFInitEngine(uint detectMode, int orientPriority, int scale, int maxFaceNumber, uint combinedMask, out IntPtr pEngine);
开始时,写了个long detectMode,返回错误信息是:0x16004,(detectFaceScaleVal 不支持)正式鬼扯,害我各种调整scale。
改成uint就ok了。
话说就一个mode,您弄
const uint ASF_DETECT_MODE_VIDEO = 0x00000000; //Video模式,一般用于多帧连续检测
const uint ASF_DETECT_MODE_IMAGE = 0xFFFFFFFF; //Image模式,一般用于静态图的单次检测
这两宝贝,我也是醉了。0/1不行吗?
2.人脸检测
[DllImport("libarcsoft_face_engine.dll", EntryPoint = "ASFDetectFaces", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern int ASFDetectFaces(IntPtr pEngine, int width, int height, int format, IntPtr pImageData, out ASF_MultiFaceInfo faceInfo);
开始时,弄了张身份证照片,102的宽度,不是4的倍数,返回0x1600F,手动编辑图片,拉伸成104的宽度便告成功。
最终写了个方法,自动设成4的倍数,如下:
private (int W, int H, IntPtr PImageData) GetImageData(Bitmap bitmap)
{
var bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
int width = (bitmap.Width + 3) / 4 * 4;
var bytesCount = bmpData.Height * width * 3;
IntPtr pImageData = Marshal.AllocCoTaskMem(bytesCount);
if (width == bitmap.Width)
CopyMemory(pImageData, bmpData.Scan0, bytesCount);
else
for (int i = 0; i < bitmap.Height; i++)
CopyMemory(IntPtr.Add(pImageData, i * width * 3), IntPtr.Add(bmpData.Scan0, i * bmpData.Stride), bmpData.Stride);
bitmap.UnlockBits(bmpData);
return new ValueTuple<int, int, IntPtr>(width, bitmap.Height, pImageData);
}
踩了这两个坑后,便愉快的运行了。
话说2.0的优点也不少:
1.特征值缩小了,由原来的20多K变成1032字节(咱就不能变成1024?)
2.比对速度快了很多很多,四线程10万次的比对也只要3秒多钟。
最新文章
- VMware安装64位操作系统提示Intel VT-x处于禁用状态的解决办法
- 自定义ViewPager控制是否滑动
- 各种less开发工具
- light oj 1138 - Trailing Zeroes (III)【规律&;&;二分】
- mybatis和hibernate对比
- Windows多线程同步系列之一-----互斥对象
- Ubuntu 麒麟版下安装:Apache+php5+mysql+phpmyadmin.
- 使用nodejs爬前程无忧前端技能排行(半半成品)
- .net core 开发短网址平台的思路
- 《k8s-1.13版本源码分析》-测试环境搭建(k8s-1.13版本单节点环境搭建)
- 又双叒叕换,微软这次换Edge了
- computed计算属性
- [Java] SpringMVC工作原理之四:MultipartResolver
- Confluence 6 安装 PostgreSQL
- 剑指Offer 52. 正则表达式匹配 (字符串)
- 【洛谷】【搜索+剪枝】P1731 [NOI1999]生日蛋糕
- js的style.display小问题
- Redis实战(八)Redis的配置文件介绍
- 【虚拟化实战】Cluster设计之一资源池
- Fragment管理工具类
热门文章
- 轻量ORM-SqlRepoEx (九)与Dapper共舞
- iOS universallinks唤醒app
- 搭建Apache服务器并使用自签证书实现https访问
- wso2 ei 6.4.0安装笔记
- 使用Letsencrypt做SSL certificate
- laravel-admin 创建数据库并生成控制器
- 通过samba服务将centos7指定文件挂载到window下
- 单片机,struct ,union定义标志,节约RAM
- vue中cssModules理解可以用于加密和避免重复使用
- 博科Brocade 300光纤交换机配置zone教程