作者很懒,直接放一个py文件里面了,有一些参数需要你自己调试一下,例如下方的开头
API_KEY = "5iXburNNeeexl65W0Sx1POmg"
SECRET_KEY = "Bs5gxTRNdVoJyKvy9FeLN39kp6IOnwIe"
这个需要你自己注册一个账号,注册以后操作步骤如下
1.先在这图片的左上角点击这九个点的图标,选择人体分析接口,然后在概览里面点击领取免费尝鲜,领取全部,最好开启付费接口,反正有一万次免费试用,还可以扩大访问限制,再去创建应用
2.创建应用,就会出现如下图的一些数据
将下面的那API_KEY,和secret_KEY和换成你自己的就行了
import base64
import urllib
import requests
import time
import cv2 as cv # pip install opencv-python
import tkinter as tk
from tkinter import ttk # 下拉框依赖库
from tkinter import scrolledtext # 滚动文本框依赖库
from tkinter import N, E, S, W
API_KEY = "5iXburNNeeexl65W0Sx1POmg"
SECRET_KEY = "Bs5gxTRNdVoJyKvy9FeLN39kp6IOnwIe"
def get_file_content_as_base64(path, urlencoded=False):
"""
获取文件base64编码
:param path: 文件路径
:param urlencoded: 是否对结果进行urlencoded
:return: base64编码信息
"""
with open(path, "rb") as f:
content = base64.b64encode(f.read()).decode("utf8")
if urlencoded:
content = urllib.parse.quote_plus(content)
return content
def get_access_token():
"""
使用 AK,SK 生成鉴权签名(Access Token)
:return: access_token,或是None(如果错误)
"""
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
return str(requests.post(url, params=params).json().get("access_token"))
# 拍照
def take_a_photo():
# 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2
cap = cv.VideoCapture(0)
img_path = str(int(time.time())) + '.jpg'
while True:
# 从摄像头读取图片
sucess, img = cap.read()
# 转为灰度图片
#gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 显示摄像头
cv.imshow('----------please enter "s" to take a picture----------', img)
# 保持画面的持续,无限期等待输入
k = cv.waitKey(1)
if k == 27:
# 通过esc键退出摄像
cv.destroyAllWindows()
break
elif k == ord("s"):
# 通过s键保存图片,并退出。
cv.imwrite(img_path, img)
cv.destroyAllWindows()
break
# 关闭摄像头
cap.release()
# 打印日志
scr.insert(tk.END, '[{}]拍摄成功...\n'.format(time.strftime('%Y-%m-%d %H:%M:%S')))
# 返回图像路径
return img_path
# ----------图形界面各个组件功能的设计----------
# 清除窗口日志
def clear_the_window():
scr.delete(1.0, tk.END)
# 退出软件
def exit():
win.quit()
def body_num(response):
try:
re = response.json()
person_num=re["person_num"]
return person_num
except:
return '未能正确识别,请重试'
def body_attr(response):
person_info = response['person_info'][0]
attributes = person_info['attributes']
location=person_info["location"]# "top", "left","width","height"
gender_name = attributes['gender']['name'] # 性别name
face_mask_name = attributes['face_mask']['name'] # 口罩name
cellphone_name = attributes['cellphone']['name'] # 手机使用状态name
age_name= attributes['age']['name'] # 年龄name
top=location["top"]
left=location["left"]
width=location["width"]
height=location["height"]
return gender_name,face_mask_name,cellphone_name,age_name,top,left,width,height
def select_ttk(event):
global numberChosen
img_path = take_a_photo()
scr.insert(tk.END, '[{}]运行结果...\n'.format(time.strftime('%Y-%m-%d %H:%M:%S')))
if numberChosen.current() == 1:
#人数检测调用接口
url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_num?access_token=" + get_access_token()
image = get_file_content_as_base64(img_path, True)
payload = f'image={image}'
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json'
}
response1 = requests.request("POST", url, headers=headers, data=payload)
try:
num=body_num(response1)
scr.insert(tk.END,
'[{}]已到人数:{}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'), num))
except:
scr.insert(tk.END,
'[{}]未识别成功,请检查!!!\n'.format(time.strftime('%Y-%m-%d %H:%M:%S')))
if numberChosen.current() == 2:
# 课堂检测调用API接口
url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr?access_token=" + get_access_token()
images = get_file_content_as_base64(img_path, True)
payload = f'image={images}'
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
re = response.json()
try:
gender_name, face_mask_name, cellphone_name, age_name,top,left,width,height=body_attr(re)
scr.insert(tk.END,
'[{}]性别:{} ,特征: 是否有口罩:{}, 是否玩手机:{}, 适龄段:{}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'),gender_name, face_mask_name, cellphone_name, age_name ))
scr.insert(tk.END,'[{}]位置信息: top{}, left {}, width{}, height{}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'),top, left, width, height ))
except:
scr.insert(tk.END,
'[{}]未识别成功,请检查!!!\n'.format(time.strftime('%Y-%m-%d %H:%M:%S')))
# -------------创建窗口--------------
win = tk.Tk()
win.title('课堂纪律检测')
win.geometry('800x400')
# ------------窗口组件设计-----------
# grid中的参数:column, columnspan, in, ipadx, ipady, padx, pady, row, rowspan,sticky
# 下拉框组件
number = tk.StringVar
numberChosen = ttk.Combobox(win, textvariable=number)
numberChosen['value'] = ('please select','人数','课堂状态检测')
numberChosen.current(0) # 设置默认值为第一个,即默认下拉框中的内容
numberChosen.grid(row=1, column=1, rowspan=1, sticky=N + E + S + W)
# 下拉框触发动作 (绑定点击事件)
numberChosen.bind('<<ComboboxSelected>>', select_ttk)
# 清除按钮组件
tk.Button(win, cnf={'text': 'clear', 'command': clear_the_window}).grid(row=1, column=2, ipadx=1, sticky=N + E + S + W)
# 退出按钮组件
tk.Button(win, cnf={'text': 'exit', 'command': exit}).grid(row=1, column=3, ipadx=1, sticky=N + E + S + W)
# 滚动文本框组件
scr = scrolledtext.ScrolledText(win)
scr.grid(row=2, column=1, columnspan=3, rowspan=1)
# 使窗口一直显示
win.mainloop()
这是运行后的结果,会先调用你的摄像头拍个照,然后调用API进行图像分析,做的比较简陋,你们可以根据数据自己再加点东西:
一般来说不会有什么问题,如果有问题可以发留言,我看到了会回你的,也可以发邮件给我qq邮箱:2956158279@qq.com,欢迎小伙伴们一起交流