图像识别:基于百度api的人体属性检测,可用作期末课设

作者很懒,直接放一个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,欢迎小伙伴们一起交流

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值