(。・∀・)ノ゙嗨咯,Everyone~
今天给大家带来的是 windows平台下,如何通过H5页面实现人脸识别的功能呢,一起探索!
首先能,还是介绍一下百度人脸识别的接口情况吧,详情可见官方文档:http://ai.baidu.com/docs#/Face-API/top
本次系列将会持续更新,人脸检测,人脸对比,人脸查三个方向的实例
好了,回归本贴主题,【H5的人脸检测】
人脸检测的官方描述:
检测请求图片中的人脸,返回人脸位置、72个关键点坐标、及人脸相关属性信息。
检测响应速度,与图片中人脸数量相关,人脸数量较多时响应时间会有些许延长。
典型应用场景:如人脸属性分析,基于人脸关键点的加工分析,人脸营销活动等。
五官位置会标记具体坐标;72个关键点坐标也包含具体坐标,但不包含对应位置的详细位置描述。
总结一句话就是:检测人脸图片,返回各种人脸属性数据。
接下来重点讲解如何实现吧~实现的样式如图(稍微把我给P了一下,哈哈)
注意:此实例并不是最优的一种方式,只是一个基础的实现过程,具体优化需要后续努力~
第一步:以下是一段判断浏览器是否支持HTML5的一个函数方法,便于大家测试。
//判断浏览器是否支持HTML5 Canvas
window.onload = function () {
try {
//动态创建一个canvas元 ,并获取他2Dcontext。如果出现异常则表示不支持 document.createElement("canvas").getContext("2d");
// document.getElementById("support").innerHTML = "浏览器支持HTML5 CANVAS";
}
catch (e) {
// document.getElementByIdx("support").innerHTML = "浏览器不支持HTML5 CANVAS";
}
};
第二步:写一个视频流的监听,然后在通过方法实时抓拍获取图片数据。
//这段代 主要是获取摄像头的视频流并显示在Video 签中
window.addEventListener("DOMContentLoaded", function () {
var canvas = document.getElementById("canvas"),
context = canvas.getContext("2d"),
video = document.getElementById("video"),
videoObj = { "video": true },
errBack = function (error) {
console.log("Video capture error: ", error.code);
};
// $("#snap").click(function () {
// context.drawImage(video, 0, 0, 330, 250);
// })
//拍照按钮
setInterval(function(){
context.drawImage(video, 0, 0, 330, 250)
CatchCode();
},1000);
//navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianow
if (navigator.getUserMedia) {
navigator.getUserMedia(videoObj, function (stream) {
video.srcObject = stream;
video.play();
}, errBack);
} else if (navigator.webkitGetUserMedia) {
navigator.webkitGetUserMedia(videoObj, function (stream) {
video.src = window.webkitURL.createObjectURL(stream);
video.play();
}, errBack);
}
}, false);
然后就完了?NONO~~以下是重点:
接下来是如何将获取的图片数据传到后台呢?我在用ajax传base64的图片数据的时候,失败过三次
都是因为长度太长,导致后台无法获得正取的图片数据,从而调用API时返回的数据是空。
于是我的解决办法就是用的formData 作为对象传到后台进行解析
function dataURItoBlob(base64Data) {
var byteString;
if (base64Data.split(',')[0].indexOf('base64') >= 0)
byteString = atob(base64Data.split(',')[1]);
else
byteString = unescape(base64Data.split(',')[1]);
var mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0];
var ia = new Uint8Array(byteString.length);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], {type:mimeString});
}
以上这个方法是一个重点,你在用formData时,需要将base64数据转换为blob写入数据的
如果不清楚可以在本帖中提问。
前端的实现讲完了,ajax提交之后,后台需要如何处理呢?
/**
* 请求人脸检测
* @return
* @throws Exception
*/
@RequestMapping(value = "/save.do")
@ResponseBody
public Map queryService(@RequestParam("the_file") MultipartFile file) {
Map modelMap = new HashMap();
try {
//将数据转为流
InputStream content = file.getInputStream();
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = content.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
//获得二进制数组
byte[] in2b = swapStream.toByteArray();
//调用人脸检测的方法
Map strmap = FaceDetect.detectby(in2b);
//将map数据封装json传到前台
String strjson = JsonUtil.mapToJson(strmap);
modelMap.put("strjson", strjson);
modelMap.put("success", true);
} catch (Exception e) {
modelMap.put("success", false);
modelMap.put("data", e.getMessage());
}
return modelMap;
}
这是JAVA后台接受前台传来的图片数据,用的是SpringMVC框架,重点请看如何将接收的数据转为图片字节数组(因为人脸检测API是需要这个)
最后呢,就说一说人脸检测的API方法如何调用解析吧
public static Map match2(byte[] arg0,byte[] arg1) {
Map map = new HashMap();
// 请求url
String url = "https://aip.baidubce.com/rest/2.0/face/v2/match";
try {
// 活体检测人脸
String imgStr = Base64Util.encode(arg0);//
String imgParam = URLEncoder.encode(imgStr, "UTF-8");
//身份证人脸
String imgStr2 = Base64Util.encode(arg1);
String imgParam2 = URLEncoder.encode(imgStr2, "UTF-8");
String param = "images=" + imgParam + "," + imgParam2;
// 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
String accessToken = "";
String str = HttpUtil.post(url, accessToken, param);
System.out.println(str);
JSONObject jsonobject = JSONObject.fromObject(str);
String result = jsonobject.getString("result");
JSONArray json = JSONArray.fromObject(result); // 首先把字符串转成 JSONArray 对象
for(int i=0;i
由以上代码可以看出,JSON解析过程中,百度返回的其实是一个json数组,我们需要做一定的处理才行,以及得到的数据类型
好啦,今天的分享就到这里了,其实这个只是最初步的搭建H5人脸检测,后续的优化会带来活体检测的质量,以及人脸坐标位置,多人检测等
还有就是人脸系列中的比对,注册,查找等功能
附上源码地址:https://gitee.com/liyingming/faceRecognition
谢谢大家~~
webapp如何调起摄像头权限?
谷歌浏览器 是支持摄像头权限的 其他没有办法
2
我也是用的h5,前台调用摄像头,传图片到后台,后台调用百度接口
在PC端执行没有问题,摄像头能正确识别人脸;
但在手机上,特别是IOS上,所有浏览器都试过了,在H5页面上都不能启用摄像头
在android手机上,chrome浏览器是可以的,其他浏览器不行。
如果需要框的话 就用openCV来弄 但是效果会不太好
这个需要自己处理的
检测请求图片中的人脸,返回人脸位置、72个关键点坐标、及人脸相关属性信息。
请问返回的关键点坐标可以用来计算吗,比如几个点构成的面积大小、形状、距离或者角度,然后识别该区域内的色彩范围或者色差范围?
小程序可以
期待这个功能来了
可以看看百度提供的IOS相关SDK.这个SDK需要企业认证一下。企业认证是免费的。
ios的谁会啊?有研究的吗
H5的是咋做的,我是前端,我看不懂java代码啊,
调用 v3的api报错 是为什么呢 格式看了一下也是对的
"error_code":222200,"error_msg":"request body should be json format"
报错:CatchCode is not defined
麻烦问一下,你这些参数里面没传入image_type这个字段 你是怎么实现的?按照您这个思路走死胡同里了,
有研究苹果的怎么用吗?分享一下
安卓的可以,苹果的你就要改良一下了
有个缺陷苹果的手机不能用
H5说法是有些不太准确了。他这就算是HTML+JS(走Java后台 Java后台再走百度AI接口)这样的流程 外加一些额外的js插件
“H5应该只有js和html和css代码吗” 也没错 只是他的JS是走了Java后台