首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

用Javascript兑现人脸美容

2012-07-23 
用Javascript实现人脸美容?? ? ? ? 本文可视为《用HTML5实现人脸识别》的进阶,在人脸识别的基础上,我们将使

用Javascript实现人脸美容

?

? ? ? ? 本文可视为《用HTML5实现人脸识别》的进阶,在人脸识别的基础上,我们将使用纯Javascript来实现如下的功能:

    识别和标注人脸以及五官用Javascript兑现人脸美容
      对人脸进行美容用Javascript兑现人脸美容

      ?

      ? ? ? ??从本文的内容中,你将意识到,Javascript能做的,能实现的,远远比你想象的多。

      用Javascript兑现人脸美容

      演示

      一、实现

      1、人脸识别

      ? ? ? ??Face.com有包括检测、识别在内的多个API接口,根据《用HTML5实现人脸识别》一文,我们已经可以实现图片上传,并得到检测的结果,结果如下:

      ?

      用Javascript兑现人脸美容

      返回的参数

      ? ? ? ??返回参数的详细解释参见http://developers.face.com/docs/api/return-values/,其中tags为多张照片的识别结果,每一个结果包括了耳朵、眼睛、嘴、鼻的中心位置,以及年龄、性别、是否佩戴眼镜、情绪、是否在笑等多种信息。

      ? ? ? ??上传图片并请求接口的代码如下。

      function buildRequest(imgSrc) {    document.getElementById("detect").disabled = true;    document.getElementById("beauty").disabled = true;    var canvas = document.getElementById('canvas');      var ctx = canvas.getContext('2d');      var imgObj = new Image();      imgObj.src = imgSrc;      canvas.width = imgObj.width;     canvas.height = imgObj.height;      ctx.drawImage(imgObj, 0, 0);      var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);     document.getElementById("bigImg").style.width = imgObj.width;    var data = canvas.toDataURL('image/jpeg', 1.0);      newblob = dataURItoBlob(data);      var formdata = new FormData();      formdata.append("api_key", "your key");      formdata.append("api_secret", "your secret");      formdata.append("filename","avatar.jpg");      formdata.append("file",newblob);       $.ajax({         url: 'http://api.face.com/faces/detect.json?attributes=age_est,gender,mood,smiling,glasses',         data: formdata,         cache: false,         contentType: false,         processData: false,         dataType:"json",         type: 'POST',         success: function (data) {             handleResult(data.photos[0]);         }    }); }
      ?人脸标注

      ? ? ? ??我们将根据人脸识别的结果对五官和面部进行标注。标注的方式有两种,一种是基于Canvas的绘图,一种是传统DIV方式标注。下面我们采用第二种方式,原理是在各个点上画一个3*3的DIV,DIV的背景色为红色,采用绝对定位。接口返回的五官数值为宽高所在点的百分比值,所以需要先进行换算。

      ? ? ? ??标注五官的方法如下:

      function drawFacial(data) {    var width = data.width;    var height = data.height;    var points = ["eye_left", "eye_right", "mouth_left", "mouth_center", "mouth_right", "nose", "ear_left", "ear_right"];    for(var i = 0; i < points.length; i++) {        var div = document.createElement('div');        div.style.width = "3px";        div.style.height = "3px";        div.style.backgroundColor = "red";        div.style.position = "absolute";        div.className = "facePoint";        var values = data.tags[0][points[i]];        if(values != null) {            var left_x = values.x;            div.style.left = left_x * width / 100 - 1 + "px";            var left_y = values.y;            div.style.top = left_y * height / 100 - 1 + "px";            document.body.appendChild(div);        }    }}

      ?

      ? ? ? ? 标注人脸区域的方法如下:

      function drawFace(data) {var width = data.width;var height = data.height;var faceWidth = data.tags[0].width * width / 100;var faceHeight = data.tags[0].height * height / 100;var faceCenter = data.tags[0].center;var div = document.createElement('div');div.style.width = faceWidth + "px";div.style.height = faceHeight + "px";div.style.borderColor = "red";div.style.borderWidth = "1px";div.style.borderStyle = "dotted";div.style.position = "absolute";div.className = "faceBox";div.style.left = faceCenter.x * width / 100 - faceWidth / 2 - 1 + "px";div.style.top = faceCenter.y * height / 100 - faceHeight / 2 - 1 + "px";document.body.appendChild(div);}
      ???从结果来看,Face.com的检测结果非常精准。


      ?

热点排行