OpenCv之简单的人脸识别项目(属性判断页面)

news2024/10/5 16:28:26

人脸识别

  • 准备
  • 十二、属性判断页面
    • 1.导入所需的包
    • 2.设置窗口
      • 2.1定义窗口外观和大小
      • 2.2设置窗口背景
        • 2.2.1设置背景图片
        • 2.2.2创建label控件
    • 3.定义预测性别脚本
    • 4.定义预测年龄脚本
    • 5.定义关闭窗口的函数
    • 6.按钮设计
      • 6.1预测性别按钮
      • 6.2预测年龄按钮
      • 6.3返回按钮
    • 7.定义关键函数
    • 8.属性判断页面运行结果图
  • 属性判断页面完整代码
  • 十三、预测性别页面
    • 1.导入所需的包
    • 2.加载预训练的模型
      • 2.1加载预训练的人脸检测模型
      • 2.2加载预训练的性别和年龄识别模型
    • 3.定义性别和年龄的标签列表
    • 4.创建窗口
    • 5.定义选择图片的函数
    • 6.定义显示图片的函数
      • 6.1函数定义和全局变量声明
      • 6.2读取图像并转换格式
      • 6.3创建和显示图像标签
    • 7.创建预测性别的函数
      • 7.1全局变量声明和条件判断
      • 7.2 转换图像为灰度并检测人脸
      • 7.3 遍历检测到的人脸
      • 7.4 转换图像格式和显示
    • 8.定义关闭窗口的函数
    • 9.按钮设计
      • 9.1选择图片按钮
      • 9.2预测性别按钮
      • 9.3返回按钮
    • 10.定义关键函数
    • 11. 预测性别页面运行结果图
    • 11.预测性别页面功能展示图
  • 预测性别页面完整代码
  • 十四、预测年龄页面
    • 1.导入所需的包
    • 2.加载预训练的模型
      • 2.1加载预训练的人脸检测模型
      • 2.2加载预训练的性别和年龄识别模型
    • 3.定义性别和年龄的标签列表
    • 4.创建窗口
    • 5.定义选择图片的函数
    • 6.定义显示图片的函数
      • 6.1函数定义和全局变量声明
      • 6.2读取图像并转换格式
      • 6.3创建和显示图像标签
    • 7.创建预测年龄的函数
      • 7.1全局变量声明和条件判断
      • 7.2 转换图像为灰度并检测人脸
      • 7.3 遍历检测到的人脸
      • 7.4 转换图像格式和显示
    • 8.定义关闭窗口的函数
    • 9.按钮设计
      • 9.1选择图片按钮
      • 9.2预测年龄按钮
      • 9.3返回按钮
    • 10.定义关键函数
    • 11. 预测年龄页面运行结果图
    • 11.预测年龄页面功能展示图
  • 预测年龄页面完整代码

准备

本篇将展示属性判断页面,并与登录页面连接起来。动态处理页面分为预测性别和预测年龄两个分页面。

十二、属性判断页面

1.导入所需的包

tkinter:

Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。

messagebox:

这个模块是tkinter的一个扩展,提供了一个对话框,允许您显示消息框、警告框、错误框等。它是tkinter的一部分,通常与tkinter一起使用来与用户进行交互。

subprocess:

这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。

ImageTk:

ImageTk是PIL库中用于与Tkinter一起使用的模块,它提供了在Tkinter中显示图像的功能。它通常与Tkinter的PhotoImage类一起使用,以在Tkinter应用程序中显示PIL的Image对象。

import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import ImageTk, Image

2.设置窗口

2.1定义窗口外观和大小

实例化窗口,设置窗口标题,尺寸。

#设置窗口
win=tk.Tk()
win.title('属性判断')
win.geometry('600x450')

2.2设置窗口背景

2.2.1设置背景图片

调用image对象的resize方法来调整图像的大小。将调整大小后的PIL Image对象转换为Tkinter兼容的PhotoImage对象。

#背景设计
image = Image.open("15.gif")
image = image.resize((600, 450))  # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
2.2.2创建label控件

Label控件可以用来显示文本、图像或其他内容。在这里,它被用来显示前面创建的PhotoImage对象,即背景图片。

canvas = tk.Label(win, image=photo1)
canvas.pack()

3.定义预测性别脚本

定义一个名为Spcl的函数,在Python中运行另一个名为 “预测性别.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。

# 定义预测性别
def ycxb():
    script_path = "预测性别.py"
    try:
        #运行文件
        subprocess.Popen(["python", script_path])
        win.destroy()
    except Exception as e:
        # 如果有错误,弹出消息框
        messagebox.showerror("Error", f"无法打开脚本:{e}")

4.定义预测年龄脚本

定义一个名为ycnl的函数,在Python中运行另一个名为 “预测年龄.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。

# 定义预测年龄
def ycnl():
    script_path = "预测年龄.py"
    try:
        #运行文件
        subprocess.Popen(["python", script_path])
        win.destroy()
    except Exception as e:
        # 如果有错误,弹出消息框
        messagebox.showerror("Error", f"无法打开脚本:{e}")

5.定义关闭窗口的函数

当用户点击一个按钮或执行其他操作以触发 close 函数时,当前的 Tkinter 窗口将被关闭,并且一个新的 Python 进程将被启动来执行 登录页面.py 脚本。

def close():
    subprocess.Popen(["python","登录页面.py"])
    win.destroy()

用法:close函数可以用来在应用程序中创建一个简单的退出功能,或者在需要时启动新的应用程序或脚本。

6.按钮设计

6.1预测性别按钮

设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 ycxb函数。

# 按钮设计
image = Image.open("F16.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=31,command=ycxb)
bt1.place(x=190, y=130)

6.2预测年龄按钮

设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 ycnl函数。

image = Image.open("F17.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=31,command=ycnl)
bt2.place(x=190, y=230)

6.3返回按钮

定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 sb 的函数。

image = Image.open("B.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=190, y=330)

用法:close函数通常这个函数用来关闭应用程序窗口。

7.定义关键函数

win.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。

win.mainloop()

注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 win 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 win.destroy() 时,win.mainloop() 会退出,事件循环结束,应用程序终止。

8.属性判断页面运行结果图

在这里插入图片描述

属性判断页面完整代码

import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import ImageTk, Image



#设置窗口
win=tk.Tk()
win.title('属性判断')
win.geometry('600x450')


# 背景设计
image = Image.open("15.gif")
image = image.resize((600, 450))  # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()

#定义预测性别
def ycxb():
    script_path = "预测性别.py"
    try:
        #运行文件
        subprocess.Popen(["python", script_path])
        win.destroy()
    except Exception as e:
        # 如果有错误,弹出消息框
        messagebox.showerror("Error", f"无法打开脚本:{e}")

#定义预测年龄
def ycnl():
    script_path = "预测年龄.py"
    try:
        # 运行文件
        subprocess.Popen(["python", script_path])
        win.destroy()
    except Exception as e:
        # 如果有错误,弹出消息框
        messagebox.showerror("Error", f"无法打开脚本:{e}")

def close():
    subprocess.Popen(["python","登录页面.py"])
    win.destroy()

# 按钮
image = Image.open("F16.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=ycxb)
bt1.place(x=190, y=130)

image = Image.open("F17.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=ycnl)
bt2.place(x=190, y=230)

image = Image.open("B.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=190, y=330)


win.mainloop()

十三、预测性别页面

1.导入所需的包

cv2 (OpenCV):

OpenCV是一个开源的计算机视觉库,它提供了大量用于图像和视频处理的功能。cv2模块是OpenCV的Python接口,它允许您在Python中使用OpenCV的功能。OpenCV广泛用于图像识别、图像处理、物体检测、视频分析等任务。

numpy:

NumPy是一个强大的数学库,它提供了大量的数学、逻辑、集合操作和数组操作功能。它还提供了一些高级的数据结构和函数,用于处理数组和矩阵。

tkinter:

Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。

subprocess:

这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。

filedialog:

这个模块是tkinter的一个扩展,提供了一个文件对话框,允许用户选择文件或目录。它是tkinter的一部分,通常与tkinter一起使用来创建文件选择器。

Label:

Label 是 Tkinter 中的一个组件,用于在窗口中显示文本或图像。在这个上下文中,它可能被用来显示图像或相关的文本信息。

Button:

Button 是 Tkinter 中的一个组件,用于创建按钮。用户可以通过点击按钮来触发某些操作,如打开文件对话框或执行特定的功能。

face_recognition:

这个模块是一个Python库,用于对人脸进行识别和对图片中的人脸进行定位。它使用深度学习算法来识别人脸,并且可以处理实时视频或静态图片。

PIL (Python Imaging Library):

PIL是一个强大的图像处理库,它支持多种图像文件格式,并提供了一系列图像处理功能,如打开、修改、保存图像,以及图像处理操作(如缩放、裁剪、颜色转换等)。

import cv2
import numpy as np
import tkinter as tk
import subprocess
from tkinter import filedialog, Label, Button
import face_recognition
from PIL import Image, ImageTk

2.加载预训练的模型

2.1加载预训练的人脸检测模型

使用 OpenCV 的 CascadeClassifier 函数加载了一个预先训练的人脸检测模型。这个模型保存在文件 haarcascade_frontalface_default.xml 中,它包含了检测人脸所需的特征。

# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

2.2加载预训练的性别和年龄识别模型

分别使用 OpenCV 的 dnn.readNetFromCaffe 函数加载了两个预先训练的模型,用于性别和年龄的识别。这些模型保存在 deploy_gender.prototxt 和 deploy_age.prototxt 文件中,以及对应的 gender_net.caffemodel 和 age_net.caffemodel 文件中。

# 加载预训练的性别和年龄识别模型
gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')

3.定义性别和年龄的标签列表

这两个列表分别定义了性别和年龄的标签。gender_list 包含两个性别标签 ‘Male’ 和 ‘Female’。age_list 包含不同的年龄范围标签,这些标签用于描述识别到的年龄组。

# 定义性别和年龄的标签列表
gender_list = ['Male', 'Female']
age_list = ['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)']

4.创建窗口

定义窗口名称、尺寸。

# 创建 tkinter 窗口
root = tk.Tk()
root.title("预测性别")
root.geometry("750x600")

5.定义选择图片的函数

elect_image 函数的作用是让用户通过文件对话框选择一个图片文件,然后调用 display_image 函数来显示这个图片。

# 定义选择图片的函数
def select_image():
    file_path = filedialog.askopenfilename()
    if file_path:
        img = cv2.imread(file_path)
        if img is not None:
            display_image(file_path)

6.定义显示图片的函数

6.1函数定义和全局变量声明

定义了一个名为 display_image 的函数,并在函数内部声明了全局变量 img。这意味着函数内部对这个变量的修改将会影响函数外部的同名变量。

# 定义显示图片的函数
def display_image(file_path):
    # 确保 img 变量已经定义
    global img

6.2读取图像并转换格式

将调整后的图片从 OpenCV 的 NumPy 数组格式转换为 PIL 的图像格式。OpenCV 默认使用 BGR 颜色空间,而 PIL 使用 RGB 颜色空间,所以需要进行颜色空间转换。

def display_image(file_path):
    # 确保 img 变量已经定义
    global img
    img = cv2.imread(file_path)
    if img is not None:
        # 调整图像大小到相等的大小
        img = cv2.resize(img, (300, 300))  # 假设您想要将图像调整到 227x227 的大小

        # 将 OpenCV 图像转换为 PIL 图像
        pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

        # 在这里调整图像到固定大小
        pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

        # 将 PIL 图像转换为 tkinter 支持的格式
        image_tk = ImageTk.PhotoImage(pil_image)

6.3创建和显示图像标签

在 root 窗口中创建了一个新的 Label 组件,用于显示图像。它将 image_tk 设置为标签的图像,并将其放置在主窗口的 (30, 100) 位置。

# 在 root 窗口中创建一个标签来显示图像
label = tk.Label(root, image=image_tk)
label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失
label.place(x=30, y=100)

7.创建预测性别的函数

7.1全局变量声明和条件判断

首先声明 img 为全局变量。然后,它开始一个条件判断,检查 img 是否为 None。如果图片无法加载,img 将为 None。

# 创建预测性别的函数
def predict_gender():
    # 确保 img 变量已经定义
    global img
    if img is not None:

7.2 转换图像为灰度并检测人脸

将原始图像转换为灰度图像,因为大多数神经网络模型在处理图像时期望输入为灰度图像。然后,它使用之前加载的人脸检测模型 face_cascade 在灰度图像中检测人脸。detectMultiScale 函数返回一个包含所有检测到的人脸的边界框的列表。

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(gray, 1.1, 4)

7.3 遍历检测到的人脸

遍历检测到的人脸,并为每个人脸裁剪出图像区域,并将其转换为一个可以输入到神经网络中的blob。然后,它使用性别识别模型 gender_net 对输入的blob进行预测,并从 gender_preds 列表中提取性别预测。它还在原始图像上绘制一个黄色矩形框来标记检测到的人脸,并在矩形框上方显示性别预测。

# 遍历检测到的人脸
for (x, y, w, h) in faces:
    # 从原始图像中裁剪人脸区域
    face_img = img[y:y + h, x:x + w].copy()

    # 预处理人脸图像以适应神经网络输入
    blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), (78.4263377603, 87.7689143744, 114.895847746), swapRB=False)

    # 预测性别
    gender_net.setInput(blob)
    gender_preds = gender_net.forward()
    gender = gender_list[gender_preds[0].argmax()]

    # 在人脸周围画框并显示性别
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 0), 2)
    cv2.putText(img, f'{gender}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, cv2.LINE_AA)

7.4 转换图像格式和显示

将调整后的图像从 OpenCV 的 NumPy 数组格式转换为 PIL 的图像格式,并将其调整到 300x400 像素的大小。然后,它将调整后的 PIL 图像转换为 Tkinter 可以显示的 PhotoImage 对象,并在 root 窗口中创建一个标签来显示图像。

# 将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

# 在这里调整图像到固定大小
pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

# 将 PIL 图像转换为 tkinter 支持的格式
image_tk = ImageTk.PhotoImage(pil_image)


# 在 root 窗口中创建一个标签来显示图像
label = tk.Label(root, image=image_tk)
label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失
label.place(x=360, y=100)



# 将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

# 在这里调整图像到固定大小
pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

# 将 PIL 图像转换为 tkinter 支持的格式
image_tk = ImageTk.PhotoImage(pil_image)

总结:predict_gender 函数的作用是在用户选择的图片中检测人脸,并预测这些人脸的性别。它将预测结果显示在原始图像上,并更新 Tkinter 窗口以显示更新后的图像。

8.定义关闭窗口的函数

当用户点击一个按钮或执行其他操作以触发 close 函数时,当前的 Tkinter 窗口将被关闭,并且一个新的 Python 进程将被启动来执行 登录页面.py 脚本。

def close():
    subprocess.Popen(["python","属性判断.py"])
    root.destroy()

用法:close函数可以用来在应用程序中创建一个简单的退出功能,或者在需要时启动新的应用程序或脚本。

9.按钮设计

9.1选择图片按钮

设计一个按钮,用于在Tkinter图形用户界面中触发选择图片功能。当用户点击这个按钮时,会调用之前定义的select_image函数。

# 创建一个按钮,用于打开文件选择对话框
image = Image.open("A.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
open_image_btn=tk.Button(root, image=photo2, width=198, height=31,command=select_image)
open_image_btn.place(x=30,y=30)

9.2预测性别按钮

设计一个按钮,用于在Tkinter图形用户界面中触发预测性别功能。当用户点击这个按钮时,会调用之前定义的predict_gender函数。

# 按钮设计
image = Image.open("F16.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=31,command=predict_gender)
bt1.place(x=190, y=130)

9.3返回按钮

定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 sb的函数。

image = Image.open("B.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)

用法:close函数通常这个函数用来关闭应用程序窗口。

10.定义关键函数

root.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。

root.mainloop()

注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 root 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 root.destroy() 时,root.mainloop() 会退出,事件循环结束,应用程序终止。

11. 预测性别页面运行结果图

在这里插入图片描述

11.预测性别页面功能展示图

在这里插入图片描述

预测性别页面完整代码

import cv2
import numpy as np
import tkinter as tk
import subprocess
from tkinter import filedialog, Label, Button
import face_recognition
from PIL import Image, ImageTk

# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 加载预训练的性别和年龄识别模型
gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')

# 定义性别和年龄的标签列表
gender_list = ['Male', 'Female']
age_list = ['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)']

# 创建 tkinter 窗口
root = tk.Tk()
root.title("预测性别")
root.geometry("750x600")

# 定义选择图片的函数
def select_image():
    file_path = filedialog.askopenfilename()
    if file_path:
        img = cv2.imread(file_path)
        if img is not None:
            display_image(file_path)

# 创建一个按钮,用于打开文件选择对话框
image = Image.open("A.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
open_image_btn = tk.Button(root, image=photo2, width=198, height=31,command=select_image)
open_image_btn.place(x=30,y=30)

# 定义显示图片的函数
def display_image(file_path):
    # 确保 img 变量已经定义
    global img
    img = cv2.imread(file_path)
    if img is not None:
        # 调整图像大小到相等的大小
        img = cv2.resize(img, (300, 300))  # 假设您想要将图像调整到 227x227 的大小

        # 将 OpenCV 图像转换为 PIL 图像
        pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

        # 在这里调整图像到固定大小
        pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

        # 将 PIL 图像转换为 tkinter 支持的格式
        image_tk = ImageTk.PhotoImage(pil_image)

        # 在 root 窗口中创建一个标签来显示图像
        label = tk.Label(root, image=image_tk)
        label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失
        label.place(x=30, y=100)
        # label.pack()

# 创建预测性别的函数
def predict_gender():
    # 确保 img 变量已经定义
    global img
    if img is not None:
        # 转换为灰度图像
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        # 检测人脸
        faces = face_cascade.detectMultiScale(gray, 1.1, 4)

        # 遍历检测到的人脸
        for (x, y, w, h) in faces:
            # 从原始图像中裁剪人脸区域
            face_img = img[y:y + h, x:x + w].copy()

            # 预处理人脸图像以适应神经网络输入
            blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), (78.4263377603, 87.7689143744, 114.895847746), swapRB=False)

            # 预测性别
            gender_net.setInput(blob)
            gender_preds = gender_net.forward()
            gender = gender_list[gender_preds[0].argmax()]

            # 在人脸周围画框并显示性别
            cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 0), 2)
            cv2.putText(img, f'{gender}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, cv2.LINE_AA)


            # 将 OpenCV 图像转换为 PIL 图像
            pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

            # 在这里调整图像到固定大小
            pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

            # 将 PIL 图像转换为 tkinter 支持的格式
            image_tk = ImageTk.PhotoImage(pil_image)


            # 在 root 窗口中创建一个标签来显示图像
            label = tk.Label(root, image=image_tk)
            label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失
            label.place(x=360, y=100)


            # 将 OpenCV 图像转换为 PIL 图像
            pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

            # 在这里调整图像到固定大小
            pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

            # 将 PIL 图像转换为 tkinter 支持的格式
            image_tk = ImageTk.PhotoImage(pil_image)



def close():
    subprocess.Popen(["python","属性判断.py"])
    root.destroy()

# 创建预测性别的按钮
image = Image.open("F16.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
predict_gender_btn = tk.Button(root, image=photo3, command=predict_gender)
predict_gender_btn.place(x=275,y=30)

image = Image.open("B.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)

# 运行 tkinter 事件循环
root.mainloop()

十四、预测年龄页面

1.导入所需的包

cv2 (OpenCV):

OpenCV是一个开源的计算机视觉库,它提供了大量用于图像和视频处理的功能。cv2模块是OpenCV的Python接口,它允许您在Python中使用OpenCV的功能。OpenCV广泛用于图像识别、图像处理、物体检测、视频分析等任务。

numpy:

NumPy是一个强大的数学库,它提供了大量的数学、逻辑、集合操作和数组操作功能。它还提供了一些高级的数据结构和函数,用于处理数组和矩阵。

tkinter:

Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。

subprocess:

这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。

filedialog:

这个模块是tkinter的一个扩展,提供了一个文件对话框,允许用户选择文件或目录。它是tkinter的一部分,通常与tkinter一起使用来创建文件选择器。

Label:

Label 是 Tkinter 中的一个组件,用于在窗口中显示文本或图像。在这个上下文中,它可能被用来显示图像或相关的文本信息。

Button:

Button 是 Tkinter 中的一个组件,用于创建按钮。用户可以通过点击按钮来触发某些操作,如打开文件对话框或执行特定的功能。

face_recognition:

这个模块是一个Python库,用于对人脸进行识别和对图片中的人脸进行定位。它使用深度学习算法来识别人脸,并且可以处理实时视频或静态图片。

PIL (Python Imaging Library):

PIL是一个强大的图像处理库,它支持多种图像文件格式,并提供了一系列图像处理功能,如打开、修改、保存图像,以及图像处理操作(如缩放、裁剪、颜色转换等)。

import cv2
import numpy as np
import tkinter as tk
import subprocess
from tkinter import filedialog, Label, Button
import face_recognition
from PIL import Image, ImageTk

2.加载预训练的模型

2.1加载预训练的人脸检测模型

使用 OpenCV 的 CascadeClassifier 函数加载了一个预先训练的人脸检测模型。这个模型保存在文件 haarcascade_frontalface_default.xml 中,它包含了检测人脸所需的特征。

# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

2.2加载预训练的性别和年龄识别模型

分别使用 OpenCV 的 dnn.readNetFromCaffe 函数加载了两个预先训练的模型,用于性别和年龄的识别。这些模型保存在 deploy_gender.prototxt 和 deploy_age.prototxt 文件中,以及对应的 gender_net.caffemodel 和 age_net.caffemodel 文件中。

# 加载预训练的性别和年龄识别模型
gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')

3.定义性别和年龄的标签列表

这两个列表分别定义了性别和年龄的标签。gender_list 包含两个性别标签 ‘Male’ 和 ‘Female’。age_list 包含不同的年龄范围标签,这些标签用于描述识别到的年龄组。

# 定义性别和年龄的标签列表
gender_list = ['Male', 'Female']
age_list = ['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)']

4.创建窗口

定义窗口名称、尺寸。

# 创建 tkinter 窗口
root = tk.Tk()
root.title("预测性别")
root.geometry("750x600")

5.定义选择图片的函数

elect_image 函数的作用是让用户通过文件对话框选择一个图片文件,然后调用 display_image 函数来显示这个图片。

# 定义选择图片的函数
def select_image():
    file_path = filedialog.askopenfilename()
    if file_path:
        img = cv2.imread(file_path)
        if img is not None:
            display_image(file_path)

6.定义显示图片的函数

6.1函数定义和全局变量声明

定义了一个名为 display_image 的函数,并在函数内部声明了全局变量 img。这意味着函数内部对这个变量的修改将会影响函数外部的同名变量。

# 定义显示图片的函数
def display_image(file_path):
    # 确保 img 变量已经定义
    global img

6.2读取图像并转换格式

将调整后的图片从 OpenCV 的 NumPy 数组格式转换为 PIL 的图像格式。OpenCV 默认使用 BGR 颜色空间,而 PIL 使用 RGB 颜色空间,所以需要进行颜色空间转换。

def display_image(file_path):
    # 确保 img 变量已经定义
    global img
    img = cv2.imread(file_path)
    if img is not None:
        # 调整图像大小到相等的大小
        img = cv2.resize(img, (300, 300))  # 假设您想要将图像调整到 227x227 的大小

        # 将 OpenCV 图像转换为 PIL 图像
        pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

        # 在这里调整图像到固定大小
        pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

        # 将 PIL 图像转换为 tkinter 支持的格式
        image_tk = ImageTk.PhotoImage(pil_image)

6.3创建和显示图像标签

在 root 窗口中创建了一个新的 Label 组件,用于显示图像。它将 image_tk 设置为标签的图像,并将其放置在主窗口的 (30, 100) 位置。

# 在 root 窗口中创建一个标签来显示图像
label = tk.Label(root, image=image_tk)
label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失
label.place(x=30, y=100)

7.创建预测年龄的函数

7.1全局变量声明和条件判断

首先声明 img 为全局变量。然后,它开始一个条件判断,检查 img 是否为 None。如果图片无法加载,img 将为 None。

# 创建预测年龄的函数
def predict_age():
    # 确保 img 变量已经定义
    global img
    if img is not None:

7.2 转换图像为灰度并检测人脸

将原始图像转换为灰度图像,因为大多数神经网络模型在处理图像时期望输入为灰度图像。然后,它使用之前加载的人脸检测模型 face_cascade 在灰度图像中检测人脸。detectMultiScale 函数返回一个包含所有检测到的人脸的边界框的列表。

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(gray, 1.1, 4)

7.3 遍历检测到的人脸

遍历检测到的人脸,并为每个人脸裁剪出图像区域,并将其转换为一个可以输入到神经网络中的blob。然后,它使用性别识别模型 gender_net 对输入的blob进行预测,并从 gender_preds 列表中提取性别预测。它还在原始图像上绘制一个黄色矩形框来标记检测到的人脸,并在矩形框上方显示性别预测。

# 遍历检测到的人脸
for (x, y, w, h) in faces:
    # 从原始图像中裁剪人脸区域
    face_img = img[y:y + h, x:x + w].copy()

    # 预处理人脸图像以适应神经网络输入
    blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), (78.4263377603, 87.7689143744, 114.895847746), swapRB=False)

    # 预测年龄
    age_net.setInput(blob)
    age_preds = age_net.forward()
    age = age_list[age_preds[0].argmax()]

    # 在人脸周围画框并显示年龄
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 0), 2)
    cv2.putText(img, f'{age}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, cv2.LINE_AA)

7.4 转换图像格式和显示

将调整后的图像从 OpenCV 的 NumPy 数组格式转换为 PIL 的图像格式,并将其调整到 300x400 像素的大小。然后,它将调整后的 PIL 图像转换为 Tkinter 可以显示的 PhotoImage 对象,并在 root 窗口中创建一个标签来显示图像。

 # 将 OpenCV 图像转换为 PIL 图像
 pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

 # 在这里调整图像到固定大小
 pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

 # 将 PIL 图像转换为 tkinter 支持的格式
 image_tk = ImageTk.PhotoImage(pil_image)


 # 在 root 窗口中创建一个标签来显示图像
 label = tk.Label(root, image=image_tk)
 label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失
 label.place(x=360, y=100)



# 将 OpenCV 图像转换为 PIL 图像
 pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

 # 在这里调整图像到固定大小
 pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

 # 将 PIL 图像转换为 tkinter 支持的格式
 image_tk = ImageTk.PhotoImage(pil_image)

总结:predict_age 函数的作用是在用户选择的图片中检测人脸,并预测这些人脸的年龄。它将预测结果显示在原始图像上,并更新 Tkinter 窗口以显示更新后的图像。

8.定义关闭窗口的函数

当用户点击一个按钮或执行其他操作以触发 close 函数时,当前的 Tkinter 窗口将被关闭,并且一个新的 Python 进程将被启动来执行 登录页面.py 脚本。

def close():
    subprocess.Popen(["python","属性判断.py"])
    root.destroy()

用法:close函数可以用来在应用程序中创建一个简单的退出功能,或者在需要时启动新的应用程序或脚本。

9.按钮设计

9.1选择图片按钮

设计一个按钮,用于在Tkinter图形用户界面中触发选择图片功能。当用户点击这个按钮时,会调用之前定义的select_image函数。

# 创建一个按钮,用于打开文件选择对话框
image = Image.open("A.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
open_image_btn=tk.Button(root, image=photo2, width=198, height=31,command=select_image)
open_image_btn.place(x=30,y=30)

9.2预测年龄按钮

设计一个按钮,用于在Tkinter图形用户界面中触发预测性别功能。当用户点击这个按钮时,会调用之前定义的predict_gender函数。

# 按钮设计
image = Image.open("F17.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=31,command=predict_gender)
bt1.place(x=190, y=130)

9.3返回按钮

定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 sb的函数。

image = Image.open("B.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)

用法:close函数通常这个函数用来关闭应用程序窗口。

10.定义关键函数

root.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。

root.mainloop()

注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 root 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 root.destroy() 时,root.mainloop() 会退出,事件循环结束,应用程序终止。

11. 预测年龄页面运行结果图

在这里插入图片描述

11.预测年龄页面功能展示图

在这里插入图片描述

预测年龄页面完整代码

import cv2
import numpy as np
import tkinter as tk
import subprocess
from tkinter import filedialog, Label, Button
import face_recognition
from PIL import Image, ImageTk

# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 加载预训练的性别和年龄识别模型
gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')

# 定义性别和年龄的标签列表
gender_list = ['Male', 'Female']
age_list = ['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)']

# 创建 tkinter 窗口
root = tk.Tk()
root.title("选择图片")
root.geometry("750x600")

#设置背景图
image = Image.open("17.gif")
image = image.resize((750, 600))  # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
# 创建Label并将背景图片设置为背景
canvas = tk.Label(root, image=photo1)
canvas.pack()

# 定义选择图片的函数
def select_image():
    file_path = filedialog.askopenfilename()
    if file_path:
        img = cv2.imread(file_path)
        if img is not None:
            display_image(file_path)

# 创建一个按钮,用于打开文件选择对话框
image = Image.open("A.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
open_image_btn = tk.Button(root, image=photo2, command=select_image)
open_image_btn.place(x=30,y=30)

# 定义显示图片的函数
def display_image(file_path):
    # 确保 img 变量已经定义
    global img
    img = cv2.imread(file_path)
    if img is not None:
        # 调整图像大小到相等的大小
        img = cv2.resize(img, (300, 300))  # 假设您想要将图像调整到 227x227 的大小

        # 将 OpenCV 图像转换为 PIL 图像
        pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

        # 在这里调整图像到固定大小
        pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

        # 将 PIL 图像转换为 tkinter 支持的格式
        image_tk = ImageTk.PhotoImage(pil_image)

        # 在 root 窗口中创建一个标签来显示图像
        label = tk.Label(root, image=image_tk)
        label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失
        label.place(x=30, y=100)
        # label.pack()

# 创建预测年龄的函数
def predict_age():
    # 确保 img 变量已经定义
    global img
    if img is not None:
        # 转换为灰度图像
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        # 检测人脸
        faces = face_cascade.detectMultiScale(gray, 1.1, 4)

        # 遍历检测到的人脸
        for (x, y, w, h) in faces:
            # 从原始图像中裁剪人脸区域
            face_img = img[y:y + h, x:x + w].copy()

            # 预处理人脸图像以适应神经网络输入
            blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), (78.4263377603, 87.7689143744, 114.895847746), swapRB=False)

            # 预测年龄
            age_net.setInput(blob)
            age_preds = age_net.forward()
            age = age_list[age_preds[0].argmax()]

            # 在人脸周围画框并显示年龄
            cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 0), 2)
            cv2.putText(img, f'{age}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, cv2.LINE_AA)


            # 将 OpenCV 图像转换为 PIL 图像
            pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

            # 在这里调整图像到固定大小
            pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

            # 将 PIL 图像转换为 tkinter 支持的格式
            image_tk = ImageTk.PhotoImage(pil_image)


            # 在 root 窗口中创建一个标签来显示图像
            label = tk.Label(root, image=image_tk)
            label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失
            label.place(x=360, y=100)


           # 将 OpenCV 图像转换为 PIL 图像
            pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

            # 在这里调整图像到固定大小
            pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

            # 将 PIL 图像转换为 tkinter 支持的格式
            image_tk = ImageTk.PhotoImage(pil_image)


def close():
    subprocess.Popen(["python","属性判断.py"])
    root.destroy()

# 创建预测年龄的按钮
image = Image.open("F17.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
predict_age_btn = tk.Button(root, image=photo3, command=predict_age)
predict_age_btn.place(x=275,y=30)

image = Image.open("B.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)

# 运行 tkinter 事件循环
root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1792802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-opencv图像分割

文章目录 二值化图像骨骼连通域分割 二值化 所谓图像分割,就是将图像的目标和背景分离开来,更直观一点,就是把目标涂成白色,背景涂成黑色,言尽于此,是不是恍然大悟:这不就是二值化么&#xff1…

农业四情监测系统

TH-Q1农业,作为支撑国民经济建设与发展的基础产业,其稳定与高效的发展对于国家乃至全球的经济稳定具有举足轻重的意义。然而,农业的发展并非一帆风顺,它面临着诸如气候变化、病虫害、土壤质量等多种因素的挑战。在这一背景下&…

AJAX 跨域

这里写目录标题 同源策略JSONPJSONP 是怎么工作的JSONP 的使用原生JSONP实践CORS 同源策略 同源: 协议、域名、端口号 必须完全相同、 当然网页的URL和AJAX请求的目标资源的URL两者之间的协议、域名、端口号必须完全相同。 AJAX是默认遵循同源策略的,不…

yolov8摔倒检测(包含数据集+训练好的模型)

基于先进的YOLOv8模型,实现了一套高效可靠的人体摔倒检测系统。YOLOv8作为YOLO系列的最新成员,以其卓越的检测速度和准确性,在计算机视觉领域尤其是目标检测任务中表现出色。本系统不仅能够实时处理视频流或监控画面,还能对静态图…

Termux安装SSH服务与内网穿透工具实现远程SFTP传输文件

文章目录 前言1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 前言 本教程主要介绍如何在安卓 Termux 系统中使用 SFTP 文件传输并结合[cpolar内网穿透工具](cpolar - 安全的内网穿透工具)轻松实现无公网IP远程传输,无需购…

斯坦福AI团队抄袭事件,清华回应:也算国际认可

近日,斯坦福大学人工智能(AI)团队的一项备受瞩目的研究——Llama3-V大模型,陷入了抄袭风波。该团队原本以其创新的模型和低廉的训练成本为亮点,声称能够在低成本下训练出性能卓越的SOTA多模态大模型。然而,…

Postgresql中json和jsonb类型区别

在我们的业务开发中,可能会因为特殊【历史,偷懒,防止表连接】经常会有JSON或者JSONArray类的数据存储到某列中,这个时候再PG数据库中有两种数据格式可以直接一对多或者一对一的映射对象。所以我们也可能会经常用到这类格式数据&am…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于麻雀搜寻优化算法的代理购电用户用电量多维度协同校核》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【课程总结】Day6(上):机器学习项目实战--外卖点评情感分析预测

机器学习项目实战:外卖点评情感分析预测 项目目的 基于中文外卖评论数据集,通过机器学习算法,对评论内容进行情感预测。 数据集 地址:http://idatascience.cn/dataset-detail?table_id429数据集字段 字段名称字段类型字段说…

【C++ | 构造函数】类的构造函数详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-06-06 0…

华为设备配置静态路由和默认路由

华为设备配置静态路由和默认路由 理论部分知识: 路由分为两个大类:静态路由-----动态路由 静态路由:手工指定,适用于小规模的网络应用场景,如果网络规模变大,这样的方式非常不适合而且容易出错。 语法&…

【软件测试】6.设计测试用例的设计方法

目录 1.基于需求的设计方法 2.具体的设计方法 2.1等价类 2.2边界值 2.3正交法 2.4判定表法 2.5场景法 2.6 错误猜测法 1.基于需求的设计方法 基于需求的设计方法也是总的设计测试用例的方法,在工作中,我们需要参考需求文档/产品规格说明书来设计…

【AI大模型】Function Calling

目录 什么是Function Calling 示例 1:调用本地函数 Function Calling 的注意事项 支持 Function Calling 的国产大模型 百度文心大模型 MiniMax ChatGLM3-6B 讯飞星火 3.0 通义千问 几条经验总结 什么是Function Calling Function Calling 是一种函数调用机…

【游戏】Goc赚钱模拟器1.0版

Hello!大家好,我是学霸小羊,今天分享一个Goc游戏。 //注:以下代码为Goc原创代码。 大家可以在下面网址写入代码www.51goc.com慧通教育http://www.51goc.com注:Goc编辑器路径: www.51goc.com ➡ 登录 ➡ 游客登陆 ➡…

【OpenHarmony】ArkTS 语法基础 ⑤ ( ArkTS 状态管理 | @State 装饰器定义状态数据 | 使用状态数据渲染组件 )

文章目录 一、ArkTS 状态管理 - State 装饰器1、State 装饰器定义状态数据2、State 装饰器定义状态数据 - 示例分析3、使用 State 装饰器定义的状态数据渲染组件 - 示例分析 二、完整代码示例1、完整自定义组件代码示例2、展示效果 参考文档 : <HarmonyOS第一课>ArkTS开发…

实验七、创建小型实验拓扑《计算机网络》

早检到底是谁发明出来的。 一、实验目的 完成本实验后&#xff0c;您将能够&#xff1a; • 设计逻辑网络。 • 配置物理实验拓扑。 • 配置 LAN 逻辑拓扑。 • 验证 LAN 连通性。 二、实验任务 在本实验中&#xff0c;将要求您连接网络设备并配置主机实现基本的网络…

【Python】 深入理解Pandas中的iloc和loc:数据选择的艺术

基本原理 在Python的Pandas库中&#xff0c;数据选择是数据分析和处理的基础。iloc和loc是两种常用的数据选择方法&#xff0c;它们都允许用户根据索引位置或标签来选择数据。然而&#xff0c;它们在行为和用途上存在一些关键的差异。 iloc iloc是基于整数索引的&#xff0c…

微信小程序多端框架打包后发布到华为市场

app上架华为应用市场 一、android 发布到华为应用市场 1、华为应用市场注册开发者账号 https://developer.huawei.com/consumer/cn/?ha_sourcesem&ha_sourceId89000605 2、进行企业认证 3、app隐私弹窗 miniapp-privacy.json 1、协议弹窗内容&#xff1a; {"tit…

基于python的网上挂号预约系统-计算机毕业设计源码89352

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;医院当然也不例外。网上挂号预约系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采用Py…