Python编程实现拍照辨颜值

2021-06-24 04:52牟晓东
电脑报 2021年3期
关键词:赋值刘德华语句

牟晓东

Python之所以越来越强大和流行的原因之一,便是其不断发展壮大的各种标准库和第三方扩展库模块。在导入库之后,我们可以直接使用其中已经编写好的各种函数,有时仅需很少的十几行甚至是几行代码就能实现非常强大的功能。人脸识别是人工智能的重要应用方向,通过本例我们将编写一段不太复杂的Python程序实现人脸识别的一些功能,包括调用摄像头进行拍照,数据上传至百度AI(“人工智能”)接口进行年龄、颜值等的辨识和信息返回输出。扫码下载程序源代码,下面对照代码我将为您讲解代码中的要点。

1.第三方库模块的安装准备工作

以Anaconda开源Python版本为例,首先进入其PowershellPrompt命令行界面,使用“pip install xxx”命令分别安装OpenCV计算机视觉库和requests,注意OpenCV的安装命令是“pip install opencv-python”(如图1)。如果安装不成功,可尝试更换国内的镜像源(如清华、阿里云等)。在程序的开始部分使用import命令将三个库模块導入:import cv2、import requests、import base64,base64是Python内置的模块无需安装。

2.调用摄像头进行“抓拍”

首先建立变量camera,其值为“cv2.VideoCapture(0)”,即调用OpenCV中的VideoCapture()函数,其中的参数0是指当前计算机的摄像头编号,该语句完成的功能是将摄像头拍摄到的画面保存至变量camera中;接着建立一个“while True:”永远为真的循环结构,在循环体的第一个“ret,img = camera.read()”语句中,前面的ret即“return”逻辑布尔值,为真的话则执行后面的“读取camera中保存的一帧画面并赋值给变量img”,这样可以有效过滤掉摄像头刚刚被调用启动时无法读取到数据的“报错”异常情况;语句“cv2.imshow('Look here:',img)”的作用是开启一个名为“Look here:”的新窗口,其内容是显示变量img中所保存的摄像头画面;语句“key = cv2.waitKey(10)”的作用是让程序等待10毫秒,这样可以有效地获取摄像头所拍摄的画面(因为这是在一个“死循环”中);然后使用一个if条件判断:“if key == ord('s'):”,判断我们是否已经在摄像头前调整好自己的状态,是的话则按s键(注意一定是将输入法切换至英文半角状态),s即“Save”(保存拍照文件的意思);当程序检测到s键被按下后则执行三个语句:

一是“cv2.imwrite('capture.jpg',img)”,作用是将变量img中保存的一帧拍摄画面内容写至capture.jpg图片文件中,注意它的保存位置默认是与本Python程序在同一目录中;二是执行“cv2.destroyAllWindows()”,作用是关闭当前摄像头的“Look here:”拍摄窗口;三是“break”语句,作用是跳出当前的“while True:”循环。

运行该段程序,在弹出的摄像头拍照窗口前稍作调整后按下s键,我们就得到了capture.jpg图片文件(如图2)。

3.获取百度AI的AccessToken

在浏览器中访问https://ai.baidu.com/,登录自己的百度账号后点击“控制台”进入“百度智能云”;接着在左侧的项目栏中点击选择“人脸识别”,按照提示一步步填写信息建立自己的一个“人脸识别”应用;然后点击查看该应用的详情,将其中的三处关键信息的内容分别复制保存至本地(如图3):

APIKey(简称AK):srLfBxDdL1MXDMXDA4b

p5Iv9(此Key无效,需自行申请)

SecretKey(简称SK):apW7N6QIyPNvLvk5FW

B53cMXDMXDGbXc(此Key无效,需自行申请)

请求地址:https://aip.baidubce.com/rest/2.0/

face/v3/detect

再次返回至Python编程环境中,将AK和SK的值分别赋给变量ApiKey和SecretKey,注意其类型为str字符串型,两侧均要添加引号;接着按照百度的提示建立变量host,赋值为“'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_creden

tials&client_id=' + ApiKey + '&client_secret=' + SecretKey”,将AK和SK的值通过字符串连接进行“构造”,目的是获取百度API的AccessToken“访问令牌”;然后建立变量response,通过requests中的get方法赋值为“requests.get(host)”;如果有返回值(if response:),则通过语句“print(response.json())”将json数据打印输出。

单独运行该段程序,从返回的json数据中找到“'access_token':”,后面的“24.7c1cd7018cec7572

698388888888438a.2592000.1612133454.282335-

17598582” (已做改写处理)便是我们想要得到的Access Token值(如图4),其有效访问期限是一个月。

4.测试本地图片文件

获取到Access Token值后,APIKey和SecretKey便暂时退出“舞台”,删除本段程序,开始构建本地图片文件的上传检测程序:

建立变量request_url,为其赋值为之前从百度智能云中复制的“请求地址”:“https://aip.baidubce.com/rest/2.0/face/v3/detect”,这便是Python程序与百度间进行数据通信的检测“入口”;接着建立变量filename,赋值为“Liu.jpg”(搜索下载的刘德华图片);语句“img = cv2.imread(filename)”的作用是将读取到的测试图片文件信息保存至变量img中,然后通过语句“f = open(filename,'rb')”,以只读二进制的方式打开该文件并存入文件变量f中;建立变量img_test,其值为读取文件變量f的值并进行Base64编码:str(base64.b64encode(f.read()),encoding='utf-8');接着建立字典型的参数变量params,其值包括三个“键值对”,即:“image”:img_test,“image_type”:“BASE64”,“face_field”:“age,beauty”,最后的“face_field”键所对应的值“age,beauty”是可自定义的,在此仅以检测年龄age和颜值beauty为例,还可以检测是否戴眼镜glasses、人种race和热情度emotion等等。

Base64编码是网络上最常见、也是最基本的用于传输8bit字节代码的二进制编码方式,用来将非ASCII字符的数据如中文、图片、视频等文件转换成ASCII字符便于安全传输的方法,学好它有利于你对应用底层的理解,我们将在以后对这种编码进行详细的讲解和编写专门的实例。

根据刚刚获取的access_token,构建变量request_url,按照百度API帮助文档所提供的信息为其赋值为“request_url + "?access_token=" + access_token”;然后建立变量headers和response,均按照百度要求进行赋值(可直接从帮助文档中进行代码的复制改写);最后可以先通过“print (response.json())”将百度AI判断的json数据信息打印输出(如图5),发现该数据包含的信息比较多,但我们最关心的是其中的age和beauty值,需要仔细查看其结构(类似于Python的字典与列表的相互嵌套),最后不难构造出两个语句:

print('刘德华的年龄是:',response.json()['result']['face_list'][0]['age'])

print('刘德华的颜值打分是:',response.json()['result']['face_list'][0]['beauty'])

这样,就可以将“print (response.json())”语句前面添加#进行过滤,我们只要最终的结果:“刘德华的年龄是:38,刘德华的颜值打分是:69.95”。

5.将本地图片更换为摄像头抓拍图片进行检测

现在,将调用摄像头进行图像的“抓拍”程序段与测试本地图片程序段进行组合,注意要将第二段程序中的变量filename赋值为“capture.jpg”(之前值为“Liu.jpg”),最后的print语句提示信息也修改为“我的”。

运行程序,调用摄像头拍照(摆好POSE后按下s键)生成自己的capture.jpg图片文件后上传至百度智能云进行分析,最终返回结果:“我的年龄是:41,我的颜值打分是:33.5”。

猜你喜欢
赋值刘德华语句
请把我当普通演员
算法框图问题中的易错点
抽象函数难度降 巧用赋值来帮忙
利用赋值法解决抽象函数相关问题オ
基本算法语句
我喜欢
学生为什么“懂而不会”
刘德华 都是朋友
作文语句实录