찾다
웹 프론트엔드H5 튜토리얼HTML5 기반의 얼굴인식 실시간 인증 구현 방법

최근에는 알리페이, 초상은행 출금, 연금수령 등 신원인증 분야에서 얼굴인식 기술이 많이 활용되고 있다. 그러나 위조방지 및 인증보안 측면에서 현재는 특히 모바일 단말에서의 실시간 인증 기술 측면에서는 아직 더 해결해야 할 과제이다.
이 기사에서는 HTML5 환경에서 얼굴 모델과 결합하여 얼굴 추적 및 감지를 달성하는 데 사용할 수 있는 clmtrackr.js 감지 도구를 소개합니다. 동시에 실시간 인증을 위해 동작 인식이 사용됩니다.
하지만 이 솔루션은 Firefox나 Chrome에서만 사용할 수 있습니다. 그리고 이는 연구 및 연구에만 적합하며 실제 시나리오에서는 이상적이지 않으며 적용하기 전에 추가 최적화가 필요합니다.
관련 기술이 있으신 분은 저에게 추천해 주셔도 됩니다.

<!DOCTYPE html>  

    <!--  

    Ideally these elements aren&#39;t created until it&#39;s confirmed that the   

    client supports video/camera, but for the sake of illustrating the   

    elements involved, they are created with markup (not JavaScript)  

    -->  

    <html>  

    <meta charset="GBK">  

    <style>  

    #container {  

    position : relative;  

    }  

     

    #canvas {  

    position : absolute;  

    left : 0;  

    top : 0;  

    }  

    </style>  

    <script src="utils.js"></script>  

    <script src="clmtrackr.js"></script>  

    <script src="./models/model_pca_20_svm.js"></script>  

    <script src="numeric.js"></script>  

    <script src="ccv.js"></script>  

      

    <audio id="media">   

    你的浏览器不支持audio标签。  

    </audio>  

    <p id="container">  

    <video id="video" width="600" height="400" autoplay >   

    您的浏览器不支持video标签  

    </video>  

    <canvas id="canvas" width="600" height="400"></canvas>  

    </p>      

      

    <button id="snap">Snap Photo</button>  

      

    <button id="start">Start</button>  

      

    <button id="showposition">显示</button>  

      

    <button id="hideposition">不显示</button>  

      

    <br/>  

      

    <button id="mouse">张嘴验证</button>   

    <button id="head">摇头验证</button>   

    <button id="eye">眨眼验证</button>  

      

      

    <p id="tip">  

    </p>  

    <p id="result">  

    </p>  

    <p id="msg">  

    </p>  

      

    <p id="positions">  

    </p>  

      

    <script>  

      

    var showpos=false;  

    // Put event listeners into place  

    //window.addEventListener("DOMContentLoaded", function() {  

      

    // Grab elements, create settings, etc.  

    var canvas = document.getElementById("canvas"),  

    context = canvas.getContext("2d"),  

    video = document.getElementById("video"),  

    videoObj = { "video": true },  

    errBack = function(error) {  

    if (error.PERMISSION_DENIED) {  

    jAlert(&#39;用户拒绝了浏览器请求媒体的权限&#39;, &#39;提示&#39;);  

    } else if (error.NOT_SUPPORTED_ERROR) {  

    jAlert(&#39;对不起,您的浏览器不支持拍照功能,请使用其他浏览器&#39;, &#39;提示&#39;);  

    } else if (error.MANDATORY_UNSATISFIED_ERROR) {  

    jAlert(&#39;指定的媒体类型未接收到媒体流&#39;, &#39;提示&#39;);  

    } else {  

    jAlert(&#39;系统未能获取到摄像头,请确保摄像头已正确安装。或尝试刷新页面,重试&#39;, &#39;提示&#39;);  

    }  

    };  

      

    // Put video listeners into place  

    if(navigator.getUserMedia) { // Standard  

      

    navigator.getUserMedia(videoObj, function(stream) {  

      

    video.src = stream;  

    video.play();  

      

    }, errBack);  

      

    } else if(navigator.webkitGetUserMedia) { // WebKit-prefixed  

      

    try{  

      

    navigator.webkitGetUserMedia(videoObj, function(stream){   

    video.src = window.webkitURL.createObjectURL(stream);  

    video.play();  

    }, errBack);  

      

    }catch(error){  

    alert(error);  

    }  

      

    }  

    else if(navigator.mozGetUserMedia) { // Firefox-prefixed  

    navigator.mozGetUserMedia(videoObj, function(stream){  

      

    video.src = window.URL.createObjectURL(stream);  

    video.play();  

    }, errBack);  

    }  

      

      

      

    // Trigger photo take  

    document.getElementById("snap").addEventListener("click", function() {  

    context.drawImage(video, 0, 0, 600, 400);  

    });  

    document.getElementById("start").addEventListener("click", function() {  

    startTrack();  

    });  

      

      

    document.getElementById("showposition").addEventListener("click", function() {  

    showpos=true;  

    });  

      

    document.getElementById("hideposition").addEventListener("click", function() {  

    showpos=false;  

    });  

      

    document.getElementById("mouse").addEventListener("click", function() {  

    alive_mouse();  

    });  

    document.getElementById("head").addEventListener("click", function() {  

    alive_head();  

    });  

      

    document.getElementById("eye").addEventListener("click", function() {  

    alive_eye();  

    });  

      

      

      

      

    //}, false);  

      

      

    </script>  

      

    <script>  

      

    //////////////////////////////////////////////////////////////////////////////  

    //活体  

    var last_time=0;//时间因素  

    var last_nose_left=0;  

    var last_nose_top=0;  

      

    //张嘴动作  

    var is_mouse_ok=false;   

    var is_alive_mouse=false;  

    var last_dis_eye_norse=0;  

    var last_dis_mouse=0;  

    function alive_mouse(){  

      

    var media = document.getElementById("media");  

    media.src="mp3/alive_mouse.mp3";  

    media.play();  

      

    document.getElementById("tip").innerHTML="请张合嘴巴";  

    document.getElementById(&#39;result&#39;).innerHTML = "";  

      

    is_mouse_ok=false;  

    last_dis_mouse=0;  

    last_time=0;  

    last_dis_eye_norse=100000000;   

      

    is_alive_head=false;  

    is_alive_mouse=true;  

    is_alive_eye=false;  

      

    }  

    //摇头动作  

    var is_head_ok=false;   

    var is_alive_head=false;  

    var last_dis_left_right=100000000;   

    function alive_head(){  

      

    var media = document.getElementById("media");  

    media.src="mp3/alive_head.mp3";  

    media.play();  

      

    document.getElementById("tip").innerHTML="请在水平方向左右摇头";  

    document.getElementById(&#39;result&#39;).innerHTML = "";  

      

    is_head_ok=false;  

    last_dis_left_right=100000000;   

    last_time=0;   

    is_alive_head=true;  

    is_alive_mouse=false;  

    is_alive_eye=false;  

      

    }  

      

    //眨眼动作  

    var is_alive_eye=false;  

    var is_eye_ok = false;  

      

    function alive_eye(){  

    var media = document.getElementById("media");  

    media.src="mp3/alive_eye.mp3";  

    media.play();  

      

    document.getElementById("tip").innerHTML="请眨眼";  

    document.getElementById(&#39;result&#39;).innerHTML = "";  

      

    is_eye_ok=false;  

    last_dis_eye_norse=100000000;   

      

    last_nose_left=0;  

    last_nose_top=0;  

      

    last_time=0;   

      

    is_alive_head=false;  

    is_alive_mouse=false;  

    is_alive_eye=true;  

    }  

      

      

    function startTrack(){  

      

    var videoInput = document.getElementById(&#39;video&#39;);  

      

    var ctracker = new clm.tracker();  

    ctracker.init(pModel);  

    ctracker.start(videoInput);  

      

      

    var canvasInput = document.getElementById(&#39;canvas&#39;);  

    var cc = canvasInput.getContext(&#39;2d&#39;);  

    cc.lineWidth=3;  

      

    function drawLoop() {  

    //requestAnimationFrame(drawLoop);  

      

      

    cc.clearRect(0, 0, canvasInput.width, canvasInput.height);  

    //ctracker.draw(canvasInput );  

    var positions = ctracker.getCurrentPosition();  

    if (showpos && positions) {  

      

    for (var p = 0;p < positions.length;p++) {  

    positionString += "featurepoint "+p+" : ["+positions[p][0].toFixed(2)+","+positions[p][1].toFixed(2) +"]<br/>";  

    }  

    document.getElementById(&#39;positions&#39;).innerHTML = positionString;  

      

      

    }  

    if(positions){  

      

    for (var p =0;p < 71;p++) {      

    cc.beginPath();  

    cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2),2, 0, Math.PI * 2, true);  

    cc.closePath();  

    cc.fillStyle = &#39;#00FF00&#39;;  

    cc.fill();  

    }  

      

      

    //cc.strokeStyle = &#39;red&#39;;  

      

    //0-14 轮廓  

    //7 下吧,最下  

      

    //2 最左边  

    //12 最右边  

      

      

    //15-22 眉毛  

      

      

    //23-27 左眼睛五个点  

    //27 左眼中间  

    //63-66 左眼四个点  

      

    //28-32 右眼睛五个点  

    //67-70 右眼四个点  

      

      

    //33-43 鼻子  

    //62 鼻中间  

      

      

    //44-61 嘴巴  

    //47 嘴巴上  

    //53 嘴巴下  

      

    ///////////////////////////////////////////////////////////////////////////////////////////////  

      

    //左眼中间  

    for (var p =27;p <=27;p++) {      

    cc.beginPath();  

    cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2), 2, 0, Math.PI * 2, true);  

    cc.closePath();  

    cc.fillStyle = &#39;red&#39;;  

    cc.fill();  

    }  

      

    //鼻子中间  

    for (var p =62;p <=62;p++) {      

    cc.beginPath();  

    cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2), 2, 0, Math.PI * 2, true);  

    cc.closePath();  

    cc.fillStyle = &#39;red&#39;;  

    cc.fill();  

    }  

    //嘴巴上  

    for (var p =57;p <=57;p++) {      

    cc.beginPath();  

    cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2), 2, 0, Math.PI * 2, true);  

    cc.closePath();  

    cc.fillStyle = &#39;red&#39;;  

    cc.fill();  

    }  

    //嘴巴下  

    for (var p =60;p <=60;p++) {      

    cc.beginPath();  

    cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2), 2, 0, Math.PI * 2, true);  

    cc.closePath();  

    cc.fillStyle = &#39;red&#39;;  

    cc.fill();  

    }  

    //////////////////////////////////////  

    //head  

    if(is_alive_head==true){  

    if(last_time==0 || (new Date().getTime()-last_time>500 && new Date().getTime()-last_time<10000 ) ){  

    var xdiff_left = positions[62][0] - positions[2][0] ;  

    var ydiff_left = positions[62][1] - positions[2][1] ;  

    var dis_left = Math.pow((xdiff_left * xdiff_left + ydiff_left * ydiff_left), 0.5);  

      

    var xdiff_right = positions[12][0] - positions[62][0] ;  

    var ydiff_right = positions[12][1] - positions[62][1] ;  

    var dis_right = Math.pow((xdiff_right * xdiff_right + ydiff_right * ydiff_right), 0.5);  

      

    var xdiff_side = positions[12][0] - positions[2][0] ;  

    var ydiff_side = positions[12][1] - positions[2][1] ;  

    var dis_side = Math.pow((xdiff_side * xdiff_side + ydiff_side * ydiff_side), 0.5);  

      

      

    var dis_left_right = dis_left - dis_right;  

    document.getElementById(&#39;result&#39;).innerHTML = dis_left_right;  

      

      

    if(last_dis_left_right>0 && dis_left_right > dis_side/3){  

      

    document.getElementById(&#39;result&#39;).innerHTML = "通过";  

      

    is_head_ok=true;  

    is_alive_head=false;  

      

    }  

      

      

      

    last_dis_left_right=dis_left_right;   

    last_time = new Date().getTime();  

      

    }  

    }  

      

    /////////////////////////////////////  

    //mouse   

    if(is_alive_mouse==true){  

    if(last_time==0 || (new Date().getTime()-last_time>500 && new Date().getTime()-last_time<10000 ) ){  

      

    //研究和鼻子距离  

    var xdiff = positions[62][0] - positions[27][0] ;  

    var ydiff = positions[62][1] - positions[27][1] ;   

    var dis_eye_norse = Math.pow((xdiff * xdiff + ydiff * ydiff), 0.5);  

      

    //上嘴唇 和下嘴唇距离  

    var xdiff_mouse = positions[53][0] - positions[47][0] ;  

    var ydiff_mouse = positions[53][1] - positions[47][1] ;   

    var dis_mouse = Math.pow((xdiff_mouse * xdiff_mouse + ydiff_mouse * ydiff_mouse), 0.5);  

      

    //上次的眼鼻距离和这次的眼鼻距离差  

    var dn= Math.abs(dis_eye_norse-last_dis_eye_norse);  

      

    //上次的嘴距离和本次的嘴距离差  

    var dm=Math.abs(dis_mouse - last_dis_mouse);  

      

      

      

      

    //鼻子的位置确保变化不大  

    if(last_nose_left>0 && last_nose_top>0  

    && Math.abs(positions[62][0]-last_nose_left)<5  

    && Math.abs(positions[62][1]-last_nose_top)<5  

    ){  

      

    document.getElementById(&#39;msg&#39;).innerHTML = dn;  

      

    if(last_dis_eye_norse>0 && dn < dis_eye_norse*1/50){   

      

    if(last_dis_mouse>0 && dm > dis_mouse/10){  

      

    document.getElementById(&#39;result&#39;).innerHTML = "通过";  

      

    is_alive_mouse=false;  

    is_mouse_ok=true;  

    }  

      

    }  

    }  

      

      

    last_dis_mouse = dis_mouse;  

    last_dis_eye_norse = dis_eye_norse;  

    last_time = new Date().getTime();   

      

    last_nose_left = positions[62][0];  

    last_nose_top = positions[62][1];  

      

    }  

    }  

      

    /////////////////////////////////////  

    //eye   

    if(is_alive_eye==true){  

    if(last_time==0 || (new Date().getTime()-last_time>10 ) ){  

      

      

    var xdiff1 = positions[62][0] - positions[27][0] ;  

    var ydiff1 = positions[62][1] - positions[27][1] ;   

    var dis_eye_norse1 = Math.pow((xdiff1 * xdiff1 + ydiff1 * ydiff1), 0.5);  

      

    var xdiff2 = positions[62][0] - positions[32][0] ;  

    var ydiff2 = positions[62][1] - positions[32][1] ;   

    var dis_eye_norse2 = Math.pow((xdiff2 * xdiff2 + ydiff2 * ydiff2), 0.5);  

      

    var dis_eye_norse = (dis_eye_norse1 + dis_eye_norse2);  

      

      

      

    if(last_nose_left>0 && last_nose_top>0  

    && Math.abs(positions[62][0]-last_nose_left)<0.5  

    && Math.abs(positions[62][1]-last_nose_top)<0.5  

    ){  

    document.getElementById(&#39;msg&#39;).innerHTML = Math.abs(dis_eye_norse - last_dis_eye_norse) - dis_eye_norse*1/20;  

      

    if(last_dis_eye_norse>0 && (Math.abs(dis_eye_norse - last_dis_eye_norse) > dis_eye_norse*1/20 ) ){  

      

    document.getElementById(&#39;result&#39;).innerHTML = "通过";  

      

    is_alive_eye=false;  

    is_eye_ok=true;  

      

    }  

    }  

      

      

    last_nose_left = positions[62][0];  

    last_nose_top = positions[62][1];  

      

    last_dis_eye_norse = dis_eye_norse;  

    last_time = new Date().getTime();   

      

    }  

      

      

    }  

      

      

    }  

      

    requestAnimationFrame(drawLoop);  

      

    }  

      

    drawLoop();  

      

    }  

      

       

      

    </script>  

    </html>


위 내용은 HTML5 기반의 얼굴인식 실시간 인증 구현 방법에 대한 내용이며, 더 많은 관련 내용은 PHP 중국어 홈페이지를 참고해주세요. (www.php.cn)!


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
H5 코드의 빌딩 블록 : 주요 요소 및 그 목적H5 코드의 빌딩 블록 : 주요 요소 및 그 목적Apr 23, 2025 am 12:09 AM

HTML5의 주요 요소에는 최신 웹 페이지를 작성하는 데 사용되는 ,,,,, 등이 포함됩니다. 1. 헤드 컨텐츠 정의, 2. 링크를 탐색하는 데 사용됩니다. 3. 독립 기사의 내용을 나타내고, 4. 페이지 내용을 구성하고, 5. 사이드 바 컨텐츠 표시, 6. 바닥 글을 정의하면, 이러한 요소는 웹 페이지의 구조와 기능을 향상시킵니다.

HTML5 및 H5 : 일반적인 사용법 이해HTML5 및 H5 : 일반적인 사용법 이해Apr 22, 2025 am 12:01 AM

HTML5와 H5 사이에는 차이가 없으며, 이는 HTML5의 약어입니다. 1.HTML5는 HTML의 다섯 번째 버전으로 웹 페이지의 멀티미디어 및 대화식 기능을 향상시킵니다. 2.H5는 종종 HTML5 기반 모바일 웹 페이지 또는 응용 프로그램을 참조하는 데 사용되며 다양한 모바일 장치에 적합합니다.

HTML5 : 현대 웹의 빌딩 블록 (H5)HTML5 : 현대 웹의 빌딩 블록 (H5)Apr 21, 2025 am 12:05 AM

HTML5는 W3C에 의해 표준화 된 하이퍼 텍스트 마크 업 언어의 최신 버전입니다. HTML5는 새로운 시맨틱 태그, 멀티미디어 지원 및 양식 향상을 도입하여 웹 구조, 사용자 경험 및 SEO 효과를 개선합니다. HTML5는 웹 페이지 구조를 더 명확하게하고 SEO 효과를 더 좋게하기 위해, 등 등과 같은 새로운 시맨틱 태그를 소개합니다. HTML5는 멀티미디어 요소를 지원하며 타사 플러그인이 필요하지 않으므로 사용자 경험을 향상시키고 속도를로드합니다. HTML5는 양식 함수를 향상시키고 사용자 경험을 향상시키고 양식 검증 효율성을 향상시키는 새로운 입력 유형을 도입합니다.

H5 코드 : 깨끗하고 효율적인 html5 작성H5 코드 : 깨끗하고 효율적인 html5 작성Apr 20, 2025 am 12:06 AM

깨끗하고 효율적인 HTML5 코드를 작성하는 방법은 무엇입니까? 답은 태그, 구조화 된 코드, 성능 최적화 및 일반적인 실수를 피함으로써 일반적인 실수를 피하는 것입니다. 1. 코드 가독성 및 SEO 효과를 향상시키기 위해 시맨틱 태그 등을 사용하십시오. 2. 적절한 계약과 의견을 사용하여 코드를 구성하고 읽을 수 있도록하십시오. 3. CDN 및 압축 코드를 사용하여 불필요한 태그를 줄임으로써 성능을 최적화합니다. 4. 태그가 닫히지 않은 것과 같은 일반적인 실수를 피하고 코드의 유효성을 확인하십시오.

H5 : 웹에서 사용자 경험을 향상시키는 방법H5 : 웹에서 사용자 경험을 향상시키는 방법Apr 19, 2025 am 12:08 AM

H5는 멀티미디어 지원, 오프라인 스토리지 및 성능 최적화로 웹 사용자 경험을 향상시킵니다. 1) 멀티미디어 지원 : H5 및 요소는 개발을 단순화하고 사용자 경험을 향상시킵니다. 2) 오프라인 스토리지 : WebStorage 및 IndexedDB는 오프라인으로 사용하여 경험을 향상시킵니다. 3) 성능 최적화 : 웹 워즈 및 요소는 성능을 최적화하여 대역폭 소비를 줄입니다.

H5 코드 해체 : 태그, 요소 및 속성H5 코드 해체 : 태그, 요소 및 속성Apr 18, 2025 am 12:06 AM

HTML5 코드는 태그, 요소 및 속성으로 구성됩니다. 1. 태그는 컨텐츠 유형을 정의하고 다음과 같은 각도 브래킷으로 둘러싸여 있습니다. 2. 요소는 컨텐츠와 같은 시작 태그, 내용 및 엔드 태그로 구성됩니다. 3. 속성 시작 태그에서 키 값 쌍을 정의하고 기능을 향상시킵니다. 웹 구조를 구축하기위한 기본 단위입니다.

H5 코드 이해 : HTML5의 기본 사항H5 코드 이해 : HTML5의 기본 사항Apr 17, 2025 am 12:08 AM

HTML5는 현대적인 웹 페이지를 구축하는 핵심 기술로 많은 새로운 요소와 기능을 제공합니다. 1. HTML5는 웹 페이지 구조 및 SEO를 향상시키는 의미 론적 요소를 소개합니다. 2. 멀티미디어 요소를 지원하고 플러그인없이 미디어를 포함시킵니다. 3. 양식은 새로운 입력 유형 및 검증 속성을 향상시켜 검증 프로세스를 단순화합니다. 4. 웹 페이지 성능 및 사용자 경험을 향상시키기 위해 오프라인 및 로컬 스토리지 기능을 제공합니다.

H5 코드 : 웹 개발자를위한 모범 사례H5 코드 : 웹 개발자를위한 모범 사례Apr 16, 2025 am 12:14 AM

H5 코드에 대한 모범 사례는 다음과 같습니다. 1. 올바른 문서 선언 및 문자 인코딩 사용; 2. 시맨틱 태그를 사용하십시오. 3. HTTP 요청을 줄입니다. 4. 비동기 부하 사용; 5. 이미지 최적화. 이러한 관행은 웹 페이지의 효율성, 유지 관리 및 사용자 경험을 향상시킬 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전