用Javascript实现人脸美容

 

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

  • 识别和标注人脸以及五官

  • 对人脸进行美容

 

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

演示

一、实现

1、人脸识别

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

 

返回的参数

        返回参数的详细解释参见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的检测结果非常精准。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值