文档章节

C#人脸识别入门篇-STEP BY STEP人脸识别--入门篇

feishixin
 feishixin
发布于 2017/08/17 09:00
字数 1588
阅读 141
收藏 0

本系列文章就将先从静态图片的人脸检测开始,逐步讲解C#是如何进行人脸识别的。共分为以下四篇

1.人脸识别入门—静态照片人脸检测

2.人脸识别入门—基于视频的人脸检测

3.人脸识别入门—人脸识别初应用

4.人脸识别入门—模拟简单的门禁系统应用

在开始之前,我们先来了解一些人脸识别的集成方式和基础知识,为下面的课程做准备。

##选择人脸引擎的心路历程

通过搜索引擎,可以大致确定集成人脸识别的可选方式有以下几种

1. 集成WebAPI

目前以百度云,腾讯云为首的互联网公司提供了基于WEBAPI的集成方式,可以通过HTTP的方式提交识别请求,识别结果通过JSON串的方式返回。基于HTTP的方式识别人脸是比较慢的,慢的原因在于IO性能,相对来讲,离线版本的API则能够充分利用本机的机器资源,不用往返于所谓的算法云服务器,直接在本地就能完成人脸识别和标记工作。

2. 集成SDK

另一种是基于SDK的本地识别方式。本地识别的优点是速度快,集成度高。而且,作为C#,我们还可以搭建自己的云识别平台。 本人也尝试过主流开源的人脸识别SDK、如OpenCV、Dlib、Seetaface等等,但经过试用,都不太理想。最近在今日头条上看到有个商业公司免费提供人脸识别SDK,就想着去下载尝试试用一下。

下载引擎发现只C++

想到就要做到,于是赶紧打开电脑下载了SDK,吐槽下今日头条,做新闻不放链接太不厚道了。只能百度了,链接在这里http://www.arcsoft.com.cn/ai/arcface.html。 下载后,发现SDK包括了人脸识别,人脸检测,人脸跟踪所有的API。不过美中不足的是,这SDK竟然只有C++版本的,Windows版本不出C#,这虹软有点不近人情啊。不过伤心归伤心,活还得做,没有C#,那我们就拿C++的包裹出C#来用。其实有了C++就等于有了C#,因为C#本身是兼容C++的,可以直接调用C++的库。

##基础概念讲解

如何使用C#调用C++的库呢,C#提供了两种技术调用C++的DLL,静态调用(DCOM+)和动态调用(P/Invoke)。 第一种是我们可以将C或者C++的函数封装成COM组件,在C#中调用时比较方便,但是COM组件需要注册,而且多次注册可能也会导致一些问题,同时在处理C或者C++的类型与COM组件的类型转换的时候也可能有些麻烦 第二种采用动态的方式就是直接用C#调用C或者C++已经写好的动态链接库 这两种方式相对而言,P/Invoke要方便一些。

P/INVOKE是什么?

P/Invoke的全称是Platform Invoke (平台调用) 它实际上是一种函数调用机制,通过P/Invoke我们就可以调用非托管DLL中的函数 ,实际上很多NET基类库中定义的类 型内部部调用了从Kernel32.dll,User32.dll,gdi32.dll等非托管DLL中导出的函数。

看一个最简单的例子

我们来看一个最简单的例子,例子如下:

  [DllImportAttribute("user32.dll", EntryPoint = "SetCursorPos")]
  [return: MarshalAsAttribute(UnmanagedType.Bool)]  //可写可不写,定义如何封送返回参数
  public static extern bool SetCursorPos(int X, int Y);

P/INVOKE的过程

关于P/Invoke的过程,我找到了MSDN上的一张图,如下所示。

P/Invoke示例图

在使用P/Invoke调用C/C++方法时,会依次执行以下操作

1 查找包含该函数的非托管DLL

2 将该非托管DLL加载到内存中

3 查找函数在内存中的地址并将其参数按照函数的调用约定压栈    4 将控制权转移给非托管函数

注意:只在第一次调用函数时,才会查找和加载非托管DLL并查找函数在内存中的地址。当非托管函数产生异常时,P/Invoke会将异常传递给托管调用方 看起来很复杂,但使用起来却很简单,只需要在C#中重新声明函数的定义就可以了,然后可以像其它函数一样调用。

注意:只在第一次调用函数时,才会查找和加载非托管DLL并查找函数在内存中的地址。当非托管函数产生异常时,P/Invoke会将异常传递给托管调用方 看起来很复杂,但使用起来却很简单,只需要在C#中重新声明函数的定义就可以了,然后可以像其它函数一样调用。

有关本系列的全部代码可以到我的资源中下载,也可以参考https://github.com/smartkids77/ArcSoft_FreeSDK_Demo 中提供的源代码来寻找各个版本的实现,本系列文章就是从这里找到的灵感.

下一篇我们将以项目实践的方式来给大家具体介绍是怎么一步步来实现静态照片的人脸检测的。

© 著作权归作者所有

共有 人打赏支持
feishixin
粉丝 0
博文 2
码字总数 7637
作品 0
杭州
技术主管
私信 提问
C# 连接 MySQL 并进行数据库操作(入门篇)

简介 这篇文章将向你介绍通过 MySQL Connector for .NET 来连接到 MySQL 数据库,然后我们将向你展示如何使用 C# 更新 MySQL 数据库记录。 环境准备 安装 Visual Studio 2008 或者 Visual S...

曾沙
2012/11/27
16.9K
3
C# 连接 MySQL 并进行数据库操作(入门篇)

简介 这篇文章将向你介绍通过 MySQL Connector for .NET 来连接到 MySQL 数据库,然后我们将向你展示如何使用 C# 更新 MySQL 数据库记录。 环境准备 安装 Visual Studio 2008 或者 Visual S...

红薯
2012/07/24
46.9K
4
新手入门篇:下载【51CTO下载中心帮助】

你是第一次来这儿吗? 你是有点晕头转向吗? 你是想下载点东西吗? 来来来,你找对地方了,就4步: 找到资料 → 下载资料 → 评价资料 → 点评评价 Step1 找到资料 方法一:首页搜索框搜资料...

51CTO下载
2009/09/23
0
0
【OpenCv小白入门】人脸检测

本篇小结是关于OpenCv小白入门的,分享一下自己的想法,并且较为详细的总结一下利用OpenCv自带的Haar分类器进行人脸检测以及基于OpenCV3.1+Vs2013+C++的具体代码实现。 原文链接 没有实际的操...

cleverzcc
2018/01/26
0
0
1- OpenCV+TensorFlow 入门人工智能图像处理-课程介绍

人工智能最火的两个方向,自然语言处理和计算机视觉 OpenCV的图像处理 TensorFlow的使用 供需关系理论,有需求所以才有提供 招聘网站: 图像算法两万以上 都需要的技能: OpenCV TensorFlow 人...

天涯明月笙
2018/04/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深度学习为图片人物换装【python代码教程】

在观看本文之前,请答应我要善良。昨天预告了下,发现很多同学对这个模型都表示出兴趣,甚至有好多同学后台发来照片让我帮他们脱裤子。授人以鱼不如授人以渔,请这些同学好自为之~ 01效果演示...

阿里云官方博客
23分钟前
1
0
centos7安装RabbitMQ详细过程

由于RabbitMQ是基于Erlang语言开发,所以在安装RabbitMQ之前,需要先安装Erlang 1、环境: centos 7.1 内核版本3.10.0-229.el7.x86_64 Erlang 19.0.4版本 RabbitMQ 3.6.14版本 2、在线安装E...

秋至丶枫以落
53分钟前
1
0
6个使用KeePassX保护密码的技巧

虽然安全是个深奥的主题,但是你可以遵循几个简单的日常习惯来减小攻击面。本文将解释确保密码信息安全的重要性,并给出如何充分利用KeePassX的建议。 日益互联的数字世界使安全成为一个重要...

Linux就该这么学
55分钟前
1
0
UnsatisfiedLinkError sawindbg.dll

方法:搜索sawindbg.dll,然后将文件报错的目录下

洛水
今天
5
0
说说不知道的Golang中参数传递

本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为。在golang中...

腾讯云加社区
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部