动手实现一个微信小程序

开发环境

  • 微信小程序开发者工具 v1.02.1809260
  • 调试基础库 2.0.4

实现功能

  • 上传一张图片检测图片中的人脸展示人脸属性信息,如年龄、性别、表情、美丑打分等。

接口

  • 接口用到的百度AI开放平台的人脸检测与属性分析
    接口文档

实现步骤

  1. 本地选取一张图片
  2. 获取图片base64编码
  3. 获取百度开发api请求token
  4. 请求人脸检测接口

效果图

效果图.png

python实现

先用python把接口调试一下,测试调通

# encoding:utf-8
import base64
import json
import urllib
import urllib.request
from urllib import request

def get_token(host):
    header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko',
                   "Content-Type": "application/json"}
    req = request.Request(url=host, headers=header_dict)
    res = request.urlopen(req)
    res = res.read()
    res_json = json.loads(res.decode('utf-8'))
    print(res_json)
    return res_json["access_token"]

'''
进行post请求
url:请求地址
values:请求体
'''
def get_info_post_json_data(url, value):
    header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko',
                   "Content-Type": "application/json"}
    req = request.Request(url=url, data=value, headers=header_dict)
    res = request.urlopen(req)
    res = res.read()
    return (res.decode('utf-8'))
'''
调用百度API,进行人脸探测
imgPath: 图片地址
access_token: 开发者token
'''
def getBaiduFaceTech(imgPath, access_token):
    request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
    # 二进制方式打开图片文件
    f = open(imgPath, 'rb')
    # 图片转换成base64
    img = base64.b64encode(f.read())
    params = {"image": img, "image_type": "BASE64", "face_field": "age,beauty,expression,face_shape,gender,glasses,landmark,race,quality,face_type"}
    params = urllib.parse.urlencode(params).encode(encoding='utf-8')
    request_url = request_url + "?access_token=" + access_token
    # 调用post其请求方法
    face_info = get_info_post_json_data(request_url, params)
    # json字符串转为对象
    face_json = json.loads(face_info)
    if face_json["error_code"] != 0:
    # 如果没有发现人像,会返回为空
    elif face_json["result"]['face_num'] != 0:
        # 把想要的部分提取存入字典中
        result = face_json['result']['face_list'][0]
        print("分值:" + str(result['beauty']))
        print("年龄:" + str(result['age']))
        print("性别:" + result['gender']['type'] + "\n可能性:" + str(result['gender']['probability']))
        gender = result['gender']['type']
        age = str(result['age'])
        beauty = str(result['beauty'])
        probability = str(result['gender']['probability'])
        face_dict = {"gender": gender, "age": age, "probability": probability, "beauty": beauty}
        return face_dict
    '''

if __name__ == '__main__':
    # client_id 为官网获取的AK, client_secret 为官网获取的SK
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度云应用的AK】&client_secret=【百度云应用的SK】'
    token = get_token(host)
    # 调用百度人脸识别API
    face_dict = getBaiduFaceTech("face.jpg", token)

步骤1:本地选取一张图片

直接调用小程序wx.chooseImage(Object object)从本地相册选择图片或使用相机拍照
https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseImage.html

wx.chooseImage({
      count: 1, // 默认9
      sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
      success: function(res) {
        // 返回选中照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
        var tempFilePaths = res.tempFilePaths;
        _this.setData({
          img: tempFilePaths[0],
        });
      })

步骤2:

早期在微信小程序中将图片base64化需要借助微信原生的 wx.canvasGetImageData 得到图片的像素信息,再通过开源库UPNG将像素信息编码,最后通过wx.arrayBufferToBase64转化为base64数据,看起来就挺麻烦的,我使用的调试基础库2.0.4,小程序有新接口获取图片base64编码,wx.getFileSystemManager() 注意版本库要在1.9.9以后的版本才支持
https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.getFileSystemManager.html

 wx.getFileSystemManager().readFile({
            filePath: _this.data.img, // 选择图片返回的相对路径
            encoding: 'base64', //编码格式
            success: res => {
              // console.log('data:image/png;base64,' + res.data)
              _this.setData({
                base64: res.data,
              })
              //   }
              // })

步骤3:

百度的api要求向API服务地址使用POST发送请求,必须在URL中带上参数access_token,没得办法要用人家的服务就得按规矩来,直接使用wx.request()发起一个网络请求
https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html

 wx.request({
      url: 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度云应用的AK】&client_secret=【百度云应用的SK】',
      header: {
        'content-type': 'application/json'
      },
      method: "POST",
      success(res) {
        _this.setData({
          access_token: res.data.access_token,
        })
      }
    })

步骤4:

带上access_token和图片base64编码请求人脸检测接口,还是一个wx.request()发起一个网络请求
https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html

 wx.request({
                url: 'https://aip.baidubce.com/rest/2.0/face/v3/detect' + '?access_token=' + _this.data.access_token,
                data: {
                  // image: _this.data.img,
                  image: _this.data.base64,
                  image_type: 'BASE64',
                  // image_type:'URL',
                  face_field: 'age,beauty,expression,face_shape,gender,glasses,landmark,race,quality,face_type',
                },
                header: {
                  'content-type': 'application/json'
                },
                method: "POST",
                success(res) {
                  wx.hideLoading();
                  // console.log(res.data);
                  var data = res.data;
                }
        })

完整参考代码 weixinxiaochengxu

参考链接

微信小程序图片压缩及base64化上传
小程序选择相册后转为base64编码的方法
小程序图片转Base64,方法总结

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容