1.3.6 • Published 2 years ago

wt-image-tools v1.3.6

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

ft-face-detection 人脸检测插件

一款基于faceapi.js开发的人脸检测插件,可实现摄像头人脸跟踪,人脸位置检测,人脸数量检测等功能

安装

# 从公司私库拉取安装插件
cnpm install ft-face-detection --registry=http://192.168.0.200:4873

例子

查看项目目录下/examples里面的例子,在该目录下使用下面命令运行例子

cnpm install
# 启动例子
node server

快速开始

html引入调用方式

<script src="ft-face.global.js"></script>
...
<body>
    <div class="box" style="position: relative;width:640px;height:480px;">
        <video autoplay id="video"></video>
        <canvas id="mycanvas" style="width:100%;height:100%;position: absolute;top:0;left:0;" />
    </div>
    <div id="tips"></div>
    <div id="position"></div>
</body>

js部分

/* umd */
const init = async function(){
    const canvas = $('#mycanvas')[0]
    const fc = window.faceDetection
    await fc.init({
        /* 节流时间间隔设定,默认300 */
        throttle:300,
        /* withFaceLandmarks为true时才能检测角度和显示landmarks,singleFaceTracking的checkAngel参数,但必须设置faceLandmarkModelPath路径加载对应的model文件 */
        withFaceLandmarks:true,
        /* performance会使用体积较小的model文件,以达到性能更好的效果 */
        performance:false,
        inputSize:128,
        modelPath:'/',
        faceLandmarkModelPath:'/',
        canvas
    })
    const videoEl = $('#video')[0]
    const stream = await navigator.mediaDevices.getUserMedia({
        audio: false,
        video: {
            /* 前置镜头 */
            facingMode: 'user',
            frameRate: { ideal: 30, max: 60 },
            /* 如果手机摄像头没有返回更高的像素,需要设置一下,前提是摄像头能达到设置的像素 */
            width:1280, height:960
        }
    })
    videoEl.srcObject = stream
    fc.on('singleFaceTracking',(data)=>{
        $('#tips').text(data.msg)
        if(data.face){
            const box = data.face.box
            console.log(data)
            $('#position').html(`
            ${data.face.score?'<div>质量分数:'+data.face.score+'</div>':''}
            <div>视频流分辨率:${data.face.imageDims.width}*${data.face.imageDims.height}</div>
            <div>width:${box.width}</div>
            <div>height:${box.height}</div>
            <div>top:${box.top}</div>
            <div>left:${box.left}</div>
            <div>right:${box.right}</div>
            <div>bottom:${box.bottom}</div>
            <div>x:${box.x}</div>
            <div>y:${box.y}</div>
            <div>time:${data.time}</div>
            `)
        }
        if(data.ok){
            fc.close('singleFaceTracking')
            /* 成功后获取质量较高的截图 */
            if($('#img').length){
                $('#img')[0].src = data.image;
            }else{
                var img = document.createElement("img");
                img.id = 'img'
                img.src = data.image;
                document.body.append(img)
            }
        }
    }).singleFaceTracking(videoEl,{
            drawType:'box',
            checkAngel:true
    })
}
window.onload = ()=>{
    init()
}

vue里面使用ESM方式引入

<template>
<div style="width:100%;height:100%;">
    <div class="box" style="position: relative;width:640px;height:480px;">
        <video autoplay ref="video"></video>
        <canvas ref="mycanvas" style="width:100%;height:100%;position: absolute;top:0;left:0;" />
    </div>
    <div id="tips">{{tips}}</div>
</div>
</template>
import faceDetection from 'ft-face-detection'
export default {
    data:{
        tips:''
    },
    mounted(){
        const canvas = this.$refs.mycanvas
        await fc.init({
            /* 节流时间间隔设定,节流时间短一些,可以尽量避免检测出模糊图片 */
            throttle:300,
            withFaceLandmarks:true,
            performance:false,
            inputSize:128,
            modelPath:'/',
            faceLandmarkModelPath:'/',
            canvas
        })
        const videoEl = this.$refs.video
        const stream = await navigator.mediaDevices.getUserMedia({
            audio: false,
            video:true
        })
        videoEl.srcObject = stream
        fc.on('singleFaceTracking',(data)=>{
            this.tips = data.msg
            if(data.ok){
                fc.close('singleFaceTracking')
            }
        }).singleFaceTracking(videoEl,{
            drawType:'box',
            checkAngel:true,
            /* 是否检测亮度 */
            checkBrightness:true
        })
    }
}

API

方法

方法名说明参数
init初始化插件InitOption
singleFaceTracking对图片或视频进行单个人脸识别跟踪,每次跟踪触发singleFaceTracking事件HTMLImageElement或HTMLVideoElement, SingleOpt(见下表)
extractFaces提取图片中的人脸HTMLImageElement
detectToImage截取当前视频对象的当前帧的图像HTMLVideoElement
on监听事件event, callback(TrackingData)回调方法
close关闭检测方法,如close('singleFaceTracking')name方法名,会同时关闭on的监听事件

InitOption属性

属性描述是否必填类型默认值
minConfidence信心最小阈值,值越大准确率越高,但检测会更难number0.6
withFaceLandmarks是否获取人脸外框的位置信息,必须配置faceLandmarkModelPath路径booleanfalse
performance是否设置为性能模式,如果设为false,使用ssd_mobilenetv1算法,准确率高,但速度稍慢,并且加载模型较大;true的时候,使用tiny_face_detector算法,速度快,模型体积小,但准确率稍低booleabtrue
inputSizeperformance为true时生效,图像处理的大小,越小越快number416
maxResultsperformance为false时生效,识别的人脸数的最大值number20
modelPath人脸识别基础模型文件的所在目录,需放在可访问资源的文件夹内string-
faceLandmarkModelPath人脸识别外框标识模型文件所在目录,需放在可访问资源的文件夹内string-
canvascanvas的html对象,需要描绘人脸识别外框时必填HTMLCanvasElement-
throttle对视频进行单个人脸识别跟踪时的节流时间配置,单位毫秒,建议设置100-500之间number300

SingleOpt属性

属性描述是否必填类型默认值
checkAngel需InitOption.withFaceLandmarks为true才生效,是否检测侧脸booleanfalse
checkBrightness是否检测人脸的亮度,曝光过度和不足都会提示检测失败booleanfalse
drawType需传入InitOption.canvas,并且InitOption.withFaceLandmarks为true才生效,备选值box,landmark,box画脸部矩形,landmark画脸部轮廓stringundefined
minfaceWidthRatio人脸检测人脸宽度相对摄像头画面的宽度最小比例,目的是为了引导用户以适当的距离进行人脸检测,不建议改动number0.4
maxfaceWidthRatio人脸检测人脸宽度相对摄像头画面的宽度最大比例,目的是为了引导用户以适当的距离进行人脸检测,不建议改动number0.8

TrackingData格式

属性说明类型
msg提示说明string
ok是否成功检测人脸boolean
code状态码,具体查看下表string
faceface数据对象object
time检测所用的时间number

状态码说明

状态码对应提示
DISTANCE_FAR人脸离摄像头太远,请靠近摄像头。
DISTANCE_NEARLY人脸离摄像头太近,请稍微远离摄像头。
TO_LEFT人脸不在画面中央,请稍微往左边靠近。
TO_RIGHT人脸不在画面中央,请稍微往右边靠近。
TO_TOP人脸不在画面中央,请稍微往上方靠近。
TO_BOTTOM人脸不在画面中央,请稍微往下方靠近。
TOOMORE_LEFTFACE请不要侧脸。
TOOMORE_RIGHTFACE请不要侧脸。
NO_FACE未检测到人脸,请把人脸对准摄像头。
SUCCESS成功检测到人脸。
DONT_MOVE正在识别,请保持不动。
DONT_SHAKE请不要摇晃。
NOT_HORIZONTAL请正对屏幕。
IS_LIGHT过度曝光,请移步到光线正常的地方检测。
IS_DARK光线不足,请移步到光线正常的地方检测。

可通过以下方法修改默认提示

faceDetection.setStatusTips({
    DISTANCE_FAR:'xxxxxxxxxxxxxxxx'
})

v.1.3.2版本新增了vue组件 faceDetectionDialog (兼容Vue2.0和3.0)

如何使用

<template>
    <!-- 与js调用方式一样,如果需要检测角度,faceLandmarkModelPath必填 -->
    <face-detection-dialog 
        checkAngel 
        checkBrightness
        faceLandmarkModelPath="/"
        modelPath="/"
        @callback="callback"
    >
    </face-detection-dialog>
</template>
/* 方法一 */
import { faceDetectionDialog } from 'ft-face-detection'
/* 方法二 */
import 'ft-face.js'

export default {
    components:{
        /* 方法一 */
        faceDetectionDialog,
        /* 方法二 */
        faceDetectionDialog:window.faceDetection.faceDetectionDialog
    },
    data:{
        tips:''
    },
    methods:{
        /* 回调的参数的格式是TrackingData */
        callback(data){
            console.log(data)
        }
    }
}
1.3.6

2 years ago

1.3.5

2 years ago

1.3.4

2 years ago

1.3.3

2 years ago

1.3.2

2 years ago