前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

时间:2024-03-25 18:04:39

总结两版人脸识别的心路历程。主要是开发中遇到的问题。

需求:实现pc端、webapp人脸拍照打卡的功能。

第一版,使用flash+JqueryFaceDetection.js 。

因为项目最初是http协议,使用getUserMedia需要 https 协议,所以pc端使用flash调摄像头。也没有要求真正的人脸识别,就用facedetection检测是否为人脸,但并不能保证是否为本人。

方案:使用jquery.webcam.min.js,调取摄像头拍照,使用facedetection检测照片中是否存在人脸。

pc端遇到的问题:浏览器只能用ie、360兼容模式、360极速模式,别的浏览器概不支持。拍照的时候对于光线也有限制,经常拍出来识别不到人脸,需要多试几次。

webapp端遇到的问题:使用input调摄像头拍照识别,图片需要压缩。小部分安卓机型比如三星、小米会发生图片旋转的问题,ios拍照也会旋转。这里使用插件exifJs,网上有很多例子,但是需要注意一个问题,旋转之后的照片,在输出到画布的时候是按照图片原始尺寸输出的,像在ios上,一张图的尺寸可能到了4000*4000,所以页面会加载异常的慢,转的base64串也会异常的大,往后台传输会卡。(这个问题困扰了我很久才找到原因,还寻思明明已经压缩过图片了,为什么得到的base64还是很大)。这里需要在旋转方法里,控制img的尺寸不要超过限定的最大尺寸,我这里是400,并且输出到画布的时候注意写全宽高,否则输出图片为剪裁之后的部分。

 

前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

第二版,使用trackingJs+腾讯云对比,正儿八经的人脸识别。

最开始说做真正人脸识别的时候,领导要求公司自己开发,奈何我们都是小渣渣。后端使用opencv对比的时候服务器压力会很大,所以领导希望人脸识别功能由前端来完成。我这个小垃圾,就这么被顶出去了,吐槽完毕。

为了更好的兼容性,网站升级https协议。

1.使用opencvjs做人脸检测+人脸对比。

https://docs.opencv.org/4.3.0/d5/d10/tutorial_js_root.html,指路opencvjs的官网。

https://blog.csdn.net/weixin_38361925/article/details/82528529,借鉴的这篇博客里的例子。

大致改了一些流程,说一下遇到的问题。

  1. java后端套页面的时候,需要jdk版本在1.8以上。
  2. 涉及到的opencv.js 、utils.js 、xml文件需要在同一个目录下,否则会报错xml文件404。
  3. 一个严重的问题就是部分安卓机、ios,页面运行卡顿,我猜是因为xml文件太大了?加载的资源太大?所以卡顿。因为华为手机可以正常运行。但是最后没有去解决,能力有限啊,方案弃用。

2.使用trackingJs做人脸检测+腾讯云人脸对比。

领导终于看不下去了,要放过我这个小渣渣了,说要采用三方的人脸识别。比较了一下阿里云和腾讯云识别的方案,腾讯云相对省钱,2000+/年/100万次。这里我们只用腾讯云的人脸对比。

 

https://trackingjs.com/ trackingjs的官网。

网上的例子也有很多,可以多方参考。

引入tracking-min.js,根据需要引入face-min.js、eye-min.js、mouth-min.js。

使用getUserMedia调用摄像头,ios端需要使用mediaDevices.getUserMedia,这里可以多阅读mediaDevices.getUserMedia--MDN的文档,详细介绍了调用手机端前置摄像头,后置摄像头的问题 。

前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

1、video.play() 可以开启摄像头,tracking.track('#video', tracker,{camera:true});也可以调用摄像头,需要提前加载tracker,所以把

 tracker.setInitialScale(4);

tracker.setStepSize(2);

tracker.setEdgesDensity(0.1);

tracking.track('#video', tracker);

几行放在getusermedia成功的回调里,去掉camera:true,否则会闪屏。

2、手机端使用canvas把video视频流输出的时候,注意画布的大小,宽高不要超过屏幕的宽高,

 var vm = $(window).width();

前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

3、使用mediaDevices.getUserMedia在ios调用摄像头,需要系统版本11以上,只支持safari浏览器,

ios系统11会显示空白,因为浏览器没有开启摄像头的权限。

ios系统12会显示黑屏,ios系统13可以显示视频流但是一帧一帧的出现。

这些统统都是因为!!video需要加上playsinline属性 !!!!!!!!!!!!!

前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

苍天啊,鬼知道我经历了什么。

这个是ios的标签,之前做视频不能快进时,还记着加上,这里就忘了,找了好几天的bug。又差点被弃用的一个方案。

前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

最后发一下最终的效果图。

前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。前端人脸识别框架tracking.js,解决ios浏览器调摄像头黑屏的问题,兼容pc、安卓、ios。

 

还是有bug的,客户反映人脸采集的时候,戴着口罩,做鬼脸也能通过,这里需要修改。今天刚反映的,只能去看源码了。待我修改好了再来完善。
最后的最后,腾讯云识别只是一个过渡,我们还是要做自己的人脸识别,所以opencvJS可能还是不会放过我。

太感谢您了,能看到这里,我真的是个小垃圾,希望可以有幸帮到你。