uniapp 安卓使用live-pusher实现人脸识别(拍照)功能

2024-04-23 1113阅读

1.nvue页面使用

nvue页面可以直接使用live-pusher组件。

由于live-pusher是矩形的,一般人脸识别使用圆形,所以添加cover-image可覆盖在live-pusher上层,修改样式。

	
请平视屏幕,并正对光源,将脸部移入圆圈内
import { homeMenuList, menuNameList } from '@/utils/homeListMap.js' import { getNewCount, getLastGroup } from "@/api/toChatWith.js" import { login, registeredUser, getUserInfo, listMenus } from '@/api/login.js'; export default { data() { return { imgData: '', pusher: null, scanWin: null, faceInitTimeout: null, snapshTimeout: null, uploadFileTask: null, faceNum: 0, loading: false, } }, mounted() { // 注意:需要在onReady中 或 onLoad 延时 this.pusher = uni.createLivePusherContext("livePusher", this); var that = this setTimeout(() => { this.startPreview() }) }, onUnload() { console.log('关闭') this.pusher && this.pusher.close({ success: (a) => { console.log("关闭"); } }) }, methods: { //获取快照 snapshotPusher() { var that = this this.pusher.snapshot({ success: (e) => { console.log(e.message, '拍照信息'); //获取图片base64 that.getMinImage(e.message.tempImagePath); }, }) }, // 开启摄像头 startPreview() { var that = this this.pusher.startPreview({ success: (a) => { console.log("livePusher.startPreview:" + JSON.stringify(a)); that.snapshotPusher() }, fail(err) { console.log(err); } }); }, //使用plus.zip.compressImage压缩图片 getMinImage(imgPath) { plus.zip.compressImage({ src: imgPath, dst: imgPath, overwrite: true, quality: 40 }, zipRes => { setTimeout(() => { var reader = new plus.io.FileReader(); reader.onloadend = res => { //获取图片base64 var speech = res.target.result; //base64图片 this.onLogin(speech) this.imgData = speech; }; //一定要使用plus.io.convertLocalFileSystemURL将target地址转换为本地文件地址,否则readAsDataURL会找不到文件 reader.readAsDataURL(plus.io.convertLocalFileSystemURL(zipRes.target)); }, 100); }, function(error) { console.log('Compress error!', error); } ); }, //调用登录接口 onLogin(val) { login({ "loginType": "faceLogin", "image": val.split(',')[1] }).then(async (res) => { console.log(res) if (res.code === '200' && res.data.clientUuid) { //识别成功 //写登录逻辑 } else { //超过五次识别未成功,则取消识别 this.faceNum += 1 if (this.faceNum >= 5) { uni.showToast({ icon: 'none', title: '人员未登记!' }) setTimeout(() => { uni.navigateBack(); }, 2000) } else { this.snapshotPusher() } } }).catch(err => { console.log(err, '调用接口失败') }) }, }, } /*#ifndef APP-NVUE*/ page { background: #fff; } /*#endif*/ .u-navbar__content__left { display: flex !important; align-items: center; } .u_nav_slot { display: flex; align-items: center; flex-direction: row; color: rgba(0, 0, 0, 0.9); font-size: 14.4rpx; font-weight: 700; } .text { margin-left: 1rpx; color: #fff; font-size: 16rpx; } .box { z-index: 99; position: absolute; left: 35%; top: 25%; width: 250rpx; height: 250rpx; background: pink; } .info { color: #76adf1 !important; font-size: 26rpx; } .livePusher { width: 300px; height: 300px; } .livefater { display: flex; justify-content: center; flex-direction: column; align-items: center; margin-top: 10rpx; margin-bottom: 50rpx; height: 350px; overflow: hidden; } .gaiimg { width: 462px; height: 350px; position: absolute; top: 0; }

2.vue页面使用

vue页面直接使用live-pusher组件将无法进入方法的回调中。

可见:官方描述

需要使用plus.video.createLivePusher方法

使用该方法,cover-image无法直接覆盖在上层,可以使用如下,添加一个html文件覆盖在上层,注意在页面销毁的时候,需要将该html隐藏! this.scanWin.hide();

  this.scanWin = plus.webview.create('/static/cover.html', '', {
                    background: 'transparent',
                    borderRaduis: '50%',
                });
                // // //新引入的webView显示
                this.scanWin.show();
    
        
            拍照
        
        
        
            正对屏幕,确保面不都在画面之内
        
        
        
    


import permission from '@/utils/permission.js'
import { homeMenuList, menuNameList } from '@/utils/homeListMap.js'
import { getNewCount, getLastGroup } from "@/api/toChatWith.js"
import { login, registeredUser, getUserInfo, listMenus } from '@/api/login.js'
export default {
    data() {
        return {
            imgData: '',
            pusher: null,
            scanWin: null,
            faceInitTimeout: null,
            snapshTimeout: null,
            uploadFileTask: null,
            intervalId: null,
            faceNum: 0,
            loading: false,
        };
    },
    methods: {
        //初始化
        faceInit() {
            this.faceInitTimeout = setTimeout(async () => {
                this.pusherInit();
                // 覆盖在视频之上的内容,根据实际情况编写
                // 利用plus.webview.create将扫描框页面及扫描动画(xxx.html)覆盖在视频之上;
                this.scanWin = plus.webview.create('/static/cover.html', '', {
                    background: 'transparent',
                    borderRaduis: '50%',
                });
                // // //新引入的webView显示
                this.scanWin.show();
            }, 1000);
        },
        //初始化播放器
        pusherInit() {
            // 获取当前窗口
            const currentWebview = this.$mp.page.$getAppWebview();
            // 创建推流,url不填写代表不上传
            this.pusher = plus.video.createLivePusher('livepusher', {
                url: '',
                top: '15%',
                left: '10%',
                width: '250px',
                height: '250px',
                position: 'absolute',
                aspect: '9:16',
                muted: false,
                'z-index': 999,
            });
            // 将推流对象加到当前页面中
            currentWebview.append(this.pusher);
            //反转摄像头
            this.pusher.switchCamera();
            //开始预览
            this.pusher.preview();
            setTimeout(() => {
                // this.snapshotPusher()
            }, 1000);
        },
        //获取快照
        snapshotPusher() {
            let that = this
            this.snapshTimeout = setTimeout(() => {
                this.pusher.snapshot(
                    e => {
                        //拿到本地文件路径
                        var src = e.tempImagePath;
                        console.log(src)
                        //获取图片base64
                        this.getMinImage(src);
                    },
                    function (e) {
                        plus.nativeUI.alert('snapshot error: ' + JSON.stringify(e));
                    }
                );
            }, 100);
        },
        //使用plus.zip.compressImage压缩图片
        getMinImage(imgPath) {
            plus.zip.compressImage({
                src: imgPath,
                dst: imgPath,
                overwrite: true,
                quality: 40
            },
                zipRes => {
                    setTimeout(() => {
                        var reader = new plus.io.FileReader();
                        reader.onloadend = res => {
                            //获取图片base64	
                            var speech = res.target.result; //base64图片
                            this.onLogin(speech)
                            this.imgData = speech;
                        };
                        //一定要使用plus.io.convertLocalFileSystemURL将target地址转换为本地文件地址,否则readAsDataURL会找不到文件
                        reader.readAsDataURL(plus.io.convertLocalFileSystemURL(zipRes.target));
                    }, 100);
                },
                function (error) {
                    console.log('Compress error!', error);
                }
            );
        },
        //调用登录接口
        onLogin(val) {
            login({
                "loginType": "faceLogin",
                "image": val.split(',')[1]
            }).then(async (res) => {
                console.log(res)
                if (res.code === '200' && res.data.clientUuid) {//识别成功
              //登录逻辑
                } else {//超过五次识别未成功,则取消识别
                    this.faceNum += 1
                    this.snapshotPusher()
                    if (this.faceNum >= 5) {
                        clearInterval(this.intervalId)
                        uni.showToast({
                            icon: 'none', title: '人员未登记!'
                        })
                        uni.navigateBack();
                    }
                }
            })
        },
        Error(message) {
            // 弹出错误提示
            this.$refs.uNotify.show({
                title: message,
                type: 'error',
                duration: '2000',
            })
        },
        handleMeus(list) {
            const menu = JSON.parse(JSON.stringify(homeMenuList))
            menuNameList.forEach(item => {
                menu[item].data = list[item] ? list[item] : []
            })
            console.log(menu, 'menu')
            this.$store.commit('SET_MENULIST', menu)
        }
    },
    onLoad(option) {
        //#ifdef APP-PLUS
        this.faceInit();
        //#endif
    },
    onUnload() {
        console.log('hide')
        this.faceInitTimeout && clearTimeout(this.faceInitTimeout);
        this.snapshTimeout && clearTimeout(this.snapshTimeout);
        this.scanWin.hide();
    },
};


.tips_text {
    margin-top: 320px;
}

总结:更推荐使用nvue的使用方式,本人本地使用时vue方式拍照的时候会出现聚焦问题。

有朋友想要图片的可以下面自取:将水印P掉就可以了,只是简单扣了个圆,有其他需求可找自己公司的UI设计。

uniapp 安卓使用live-pusher实现人脸识别(拍照)功能

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]