当前位置: 首页 > news >正文

基于虹软 人脸识别的闸机开发经验及源码分享

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近公司要开发一款人脸识别的闸机,就是在现有闸机上将一个小屏的识别装置,人脸识别成功后将闸机打开。

项目源码在 : https://gitee.com/panmingzhi/ArcSoftFace.git

使用了虹软的最新人脸识别技术完成开发 1、首先我们选择的是windows 64位的动态库,因为这个我熟悉,上手快。使用的是官方的开发库,这里的是官方在github的url : https://github.com/steponteam/FaceRecognization 官方有简单的例子,是最快上手的。但仅仅只是例子,现实使用还有很多坎。

2、取摄像头视频可以用opencv或者afroge,我使用的是afroge,因为这个库很小,仅仅只有几mb。使用afroge插入视频也有两种处理方式:1 使用videoSourcePlayer控件,重写他的paint事件,在paint事件中调用人脸追踪库,并画出方框。另外,软件启动时,再开一个Task,每间隔200ms取当前帧videoSourcePlayer.getCurrentFrame(),对当前这一帧进行人脸识别,如果识别在成功,就可以开闸了。

3、在每200ms间隔识别时,先判断一下当前的paint 人脸追踪有没有追踪到人脸,如果当前没有追踪到人脸,就可以略过当前这些的人脸识别了。

4、在识别到人脸后,不要立马开闸,要做一下限制,同一个人在不停的验证人脸时,2秒内可以不用处理。不然连续识别成功会导致语音报没完又接着重新放了一遍语音。

5、上述是最初一版的开发过程,在开发电脑上运行很流畅,也没有内存问题。而且模拟放了一个小品做测试,放了一个星期,内存始终保存在100-300左右,累计识别了25w次,这个量基本到项目上可以用一个月了。

6、悲剧总会来,开发电脑性能很强劲,视频很流畅,一点也没有卡的意思,但放在闸机上时,问题就后接踵而来了。 首先,闸机上的工供机是win7,要先安装.net 4.5.2,其次软件会加载不到libs下的dll,要安装 vcredist_x64.exe ,其次,请不要用ghost ,请不要用ghost,请不要用ghost,重要的事情3遍。否则会在系统事件中提示缺失dll,这个很抓狂,system32下己存在,但就是不断的提示缺失dll。 其次,工供机性能底,使用videoSourcePlayer不能控制FPS,导致画面有延时,大概有2秒,很可怕,查很多资料也都没用。后来就不使用videoSourcePlayer控件,直接使用NewFrame事件,然后绘制到picturebox。接收NewFrame传来的图片时,可以适当的放弃一部帧来提高流畅度,用Stopwatch来控制FPS始终保持在20帧左右。

7、在NewFrame事件中取当前帧来做人脸识别,经常会出现bitmap内存被损坏。这个问题最难搞的,甚至一度让我重新选择emgucv来实现USB相机采集,但问题还是依旧的。后来我反思了一下,使用 videoSourcePlayer 控件时没有这个问题,为什么使用pictureBox会发生,所以又回过头重新看一下videoSourcePlayer这个控件的实现。后来发现在取当前帧做人脸认别时,当前帧的图片有可能正在被绘制到pictureBox,而pictureBox.image=xxx这个方法不是立即绘制,是异步的,这就导致bitmap被同时在使用,找到问题后,加了一个lock锁就搞定了,又测试跑了一个星期,杠杠的。 8、window电脑会有一个屏幕休眠,当有人脸追踪到时,要调用windows自身的api来点亮屏幕。这个休眠是人为设定的,因为屏幕老亮着,给人感觉就是浪费电,一般设置30分钟自动屏幕关闭,软件追踪到人后,调用windows的鼠标滚珠事件来模拟有鼠标移动,达到点亮屏幕的目的。

更多内容欢迎来这里看 人脸识别的闸机开发经验及源码分享 是我这两周的折腾了,语言组织不好,但愿能给正在使用window做人脸识别一点帮助。 这是软件的截图,

转载于:https://my.oschina.net/bangbangda/blog/3016491

相关文章:

  • python 安装第三方模块
  • ajax与json
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • RPC
  • UI2Code智能生成Flutter代码——版面分析篇
  • ios设备唯一标识获取策略
  • Windows下使用资源管理器管理FTP指南
  • 激活函数汇总
  • java压缩 GZIP进行简单压缩,ZIP进行多文件保存
  • mongoDB 文档操作_增
  • 我的开源项目:FLV封装格式分析器
  • 【Leetcode】104. 二叉树的最大深度
  • SDI,ASI,HDMI,DP等接口的区别
  • Luogu P3181 [HAOI2016]找相同字符 广义$SAM$
  • 主流视音频平台参数
  • 0基础学习移动端适配
  • Create React App 使用
  • Gradle 5.0 正式版发布
  • KMP算法及优化
  • Laravel核心解读--Facades
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • passportjs 源码分析
  • spark本地环境的搭建到运行第一个spark程序
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Swift 中的尾递归和蹦床
  • 初识 beanstalkd
  • 前端临床手札——文件上传
  • 前言-如何学习区块链
  • 使用putty远程连接linux
  • 消息队列系列二(IOT中消息队列的应用)
  • 责任链模式的两种实现
  • 中文输入法与React文本输入框的问题与解决方案
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #QT项目实战(天气预报)
  • (poj1.2.1)1970(筛选法模拟)
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net Core和.Net Standard直观理解
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net 发送邮件
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET使用存储过程实现对数据库的增删改查
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • [ linux ] linux 命令英文全称及解释
  • [<MySQL优化总结>]
  • [AIGC] Java 和 Kotlin 的区别
  • [Android]一个简单使用Handler做Timer的例子
  • [autojs]autojs开关按钮的简单使用
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径