小程序开发框架_mpvue(六)卡通照片的实现思路

  随着AI技术的发展,人脸识别可以识别到人的五官的位置,大小,甚至可以实时跟踪脸部运动轨迹,这样前端就产生了很多好玩的功能,比如人脸卡通,激萌和抖音都有这样的效果,我们看下激萌的实现效果

在这里插入图片描述在这里插入图片描述

这样的效果是如何实现的?我们以左图来进行分析

这个效果图分为两个部分

1: 背景
2:卡通人脸

其中卡通人脸又是由如下几个部分组成
1: 原人物图片
2:素材图片,如特效耳朵图片,特效鼻子图片,特效嘴巴图片等等

所以为了实现如上效果,我们可以通过类似图片叠加的方式,逐一将背景,人物头像,特效素材进行叠加即可

但是我们要如何确定某张图片素材的叠加位置尼?这时候AI就要上场了,具体步骤如下

步骤一: 首先用户进行拍照或者上传一张自己的照片
步骤二: AI对照片进行人脸识别,识别出基本特征,如眼睛的位置大小,鼻子的位置大小
步骤三: 前端根据AI的计算结果将各个卡通素材叠加显示,就像photoshop里面的添加层一样

针对步骤二,根据服务端返回的人脸数据至少应包含
1)宽度,高度 ,用于设置元素的大小
2)左边距和上边距,用于设置元素的位置

所以前端核心代码如下

            layers: [
                {name:'hair', link:'xxxxxx', width: '160', height: '160' , top: '0', left: '0'},
                {name:'body', link:'xxxxxx', width: '160', height: '160' , top: '0', left: '0'},
                {name:'chin', link:'xxxxxx', width: '160', height: '160' , top: '0', left: '0'},
                {name:'eyeleft', link:'xxxxxx', width: '16', height: '16' , top: '74', left: '57'},
                {name:'eyeright', link:'xxxxxx', width: '16', height: '16' , top: '74', left: '85'},
                {name:'eyebrow', link:'xxxxxx', width: '48', height: '48' , top: '52', left: '55'},
                {name:'nose', link:'xxxxxx', width: '19', height: '19' , top: '82', left: '70'},
                {name:'mouth', link:'xxxxxx', width: '17', height: '17' , top: '96', left: '71'}
            ]

其中
name字段表示人脸卡通某部位名称
link字段表示人脸卡通中某部位的默认使用元素图片
width/height表示人脸卡通中某部位的的大小
left/top表示人脸卡通中某部位的的位置

那么我们在mpvue中封装一个组件看下效果

<template>
    <div class="preview-layer">
        <div class="layer"
            v-for="(layer, index) in layers"
            :key="index"
            :style="{height: layer.height + 'px'||5 + 'px', width: layer.width + 'px'||5 + 'px',left:layer.left + 'px', top: layer.top + 'px'}"
            :type="layer.type">
            <img class="cartoon" :src="layer.link">
        </div>
    </div>
</template>

<script>
/* eslint-disable */
export default {
    data() {
        return {
            layers: [
                {name:'hair', link:'xxxxxx', width: '160', height: '160' , top: '0', left: '0'},
                {name:'body', link:'xxxxxx', width: '160', height: '160' , top: '0', left: '0'},
                {name:'chin', link:'xxxxxx', width: '160', height: '160' , top: '0', left: '0'},
                {name:'eyeleft', link:'xxxxxx', width: '16', height: '16' , top: '74', left: '57'},
                {name:'eyeright', link:'xxxxxx', width: '16', height: '16' , top: '74', left: '85'},
                {name:'eyebrow', link:'xxxxxx', width: '48', height: '48' , top: '52', left: '55'},
                {name:'nose', link:'xxxxxx', width: '19', height: '19' , top: '82', left: '70'},
                {name:'mouth', link:'xxxxxx', width: '17', height: '17' , top: '96', left: '71'}
            ]
        }
    },
    mounted() {
    },
    methods: {
    }
}
</script>

<style>
.preview-layer {
    width: 100%;
    height: 300px;
    position: absolute;
}
.layer {
    width: 100%;
    height: 100%;
    position: absolute;
}
.cartoon {
    width: 100%;
    height: 100%;
}
</style>

这样就很容易实现激萌/抖音那种人脸特效了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值