uniapp -人脸识别 - 前端实现

1、APP开发一个人脸识别,实现刷脸功能

首先要考虑的是实现流程:

1、 打开摄像头——自动读取照片——传输给后端——后端交由第三发或自主开发来识别——返回结果(相识度比)

2、 打开摄像头——自动读取视频——传输给后端——后端通过解析视频,截取图片交由第三方或自主开发来识别——返回结果(相识度比)

我们只需要做两步骤:打开摄像头和自动读取视频或照片

2、打开摄像头

分步骤分析:打开摄像头,并展示视频效果在html上,目前有两种方式:

2.1、使用camera组件进行,借用.CREATECAMERACONTEXT()对象来打开摄像头

因为我开发的是app,camera组件不支持,在小程序上是支持的


2.2、创建 live-player 上下文 livePlayerContext 对象。注意是直播的播放而不是推流。(直播推流技术)实现视频预览和截屏

流程为  调用手机摄像头创建直播推流 → 自动截图 → 压缩图片为base64格式→ 上传图片到服务器 → 服务器调用阿里人脸api → 阿里api返回该图片与底图的相似度

下面上代码

<template>

    <view>

<div class="custom" :style="{height: CustomBar+'px'}">

<view class="navcontent" :style="[{top:statusBar + 'px'}]">

<text style="color: #FFFFFF;font-size: 16px;line-height: 45px;" class="iconfont icon-xiangzuo" @click="BackPage">返回</text>

<text style="color: #FFFFFF;font-size: 16px;line-height: 45px;">人脸识别</text>

<text></text>

</view>

</div>

        <div class="livefater">

<div style="width: 350px;height: 350px;border-radius: 350px;overflow: hidden;background-color: #CCCCCC;">

<live-pusher id='livePusher' ref="livePusher" class="livePusher" url=""

mode="SD" :muted="true" :enable-camera="true" :auto-focus="true" :beauty="1" whiteness="2"

aspect="1:1" @statechange="statechange" @netstatus="netstatus" @error = "error"

></live-pusher>

</div>

<cover-image src="../static/image/gai.png" class="gaiimg"></cover-image>

</div>

        <button class="btn" @click="startPreview">打开摄像头进行人脸识别</button>

<button type="default" @click="switchCamera">切换摄像头</button>

<button type="default" @click="stop">停止识别</button>

    </view>

</template>

//js代码部分

export default {

        data: {

            fil: true,

imgList:[""],

statusBar:'',

CustomBar: 0

        },

onLoad(){

// this.startPreview()

},

        onReady() {

            // 注意:需要在onReady中 或 onLoad 延时

            this.context = uni.createLivePusherContext("livePusher", this);

var that = this

uni.getSystemInfo({ 

success:function(e){ 

// 计算导航栏高度

that.statusBar = e.statusBarHeight 

// #ifndef MP 

if(e.platform == 'android') { 

that.CustomBar = e.statusBarHeight + 50 

}else { 

that.CustomBar = e.statusBarHeight + 45 

console.log(that.statusBar)

// #endif 

// #ifdef MP-WEIXIN 

let custom = wx.getMenuButtonBoundingClientRect() 

that.CustomBar = custom.bottom + custom.top - e.statusBarHeight 

// #endif 

// #ifdef MP-ALIPAY 

that.CustomBar = e.statusBarHeight + e.titleBarHeight 

// #endif 

}

}) 

        },

        methods: {

Timer(){},

            statechange(e) {

                console.log("statechange:" + JSON.stringify(e));

            },

            netstatus(e) {

                console.log("netstatus:" + JSON.stringify(e));

            },

            error(e) {

                console.log("error:" + JSON.stringify(e));

            },

            start: function() {

                this.context.start({

                    success: (a) => {

                        console.log("livePusher.start:" + JSON.stringify(a));

                    }

                });

            },

            close: function() {

                this.context.close({

                    success: (a) => {

                        console.log("livePusher.close:" + JSON.stringify(a));

                    }

                });

            },

//切换摄像头

switchCamera() {

this.context.switchCamera({

success: (e) => {

console.log("切换成功",e)

}

})

},

//停止推流

stop() {

this.context.stop({

success: (e) => {

console.log("停止",e)

}

})

},

// 拍照事件

            snapshot: function() {

var that = this

                this.context.snapshot({

                    success: (e) => {

                        console.log(JSON.stringify(e));

that.getMinImage(e.message.tempImagePath)

                    }

                });

            },

// 开启摄像头

            startPreview() {

console.log("1")

var that = this

                this.context.startPreview({

                    success: (a) => {

                        console.log("livePusher.startPreview:" + JSON.stringify(a));

that.Timer = setInterval(function(){

that.snapshot()

if(that.imgList.length>3){

console.log("3")

clearInterval(that.Timer)

}

},2000)

                    }

                });

            },

// 使用plus.zip.compressImage压缩图片并转换成base64

getMinImage(imgPath) {

plus.zip.compressImage(

{

src: imgPath,

dst: imgPath,

overwrite: true,

quality: 40

},

zipRes => {

setTimeout(() => {

var reader = new plus.io.FileReader();

reader.onloadend = res => {

var speech = res.target.result; //base64图片

console.log(speech);

this.imgList.push(speech);

};

//一定要使用plus.io.convertLocalFileSystemURL将target地址转换为本地文件地址,否则readAsDataURL会找不到文件

reader.readAsDataURL(plus.io.convertLocalFileSystemURL(zipRes.target));

}, 1000);

},

function(error) {

console.log('Compress error!', error);

}

);

},

BackPage() {

uni.navigateBack({

delta: 1

});

}

        }

    }

//css代码部分

.custom{

background-color: #2C65F7;

}

.navcontent{

height: 45px;

display: -ms-flex;

display: -webkit-flex;

display: flex;

justify-content:space-around;

flex-direction:row;

color:#FFFFFF;

}

.livePusher{

width: 350px;

height: 350px;

}

.livefater{

display: -ms-flex;

display: -webkit-flex;

display: flex;

justify-content:center;

flex-direction:column;

align-items:center;

margin-top: 50rpx;

margin-bottom: 50rpx;

height: 350px;

}

.gaiimg{

width: 350px;

height: 350px;

margin-top: -350px;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容