人脸识别系统之静态人脸识别

人脸识别系统

一. 静态人脸识别

1. 人脸提取

1.1. 导入资源包
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk, ImageDraw
import face_recognition
import os
import subprocess
import sys

:进行人脸识别像目前我们要先进行导入资源包,在python环境和中打开终端,安装命令例如:pip install tkinter。
Filedialog:一个与tkinter一起使用的模块,它提供了打开文件和保存文件的功能。
Messagebox:一个与tkinter一起使用的模块,它提供了显示消息框的功能,如警告、信息、询问等。
PIL (Pillow):一个图像处理库,用于打开、编辑和保存图像。它提供了广泛的图像处理功能,包括缩放、旋转、裁剪、添加文本等。
face_recognition:这是一个用于检测和识别图像中的人脸的库。它使用深度学习模型来执行这些任务,并提供了易于使用的API。
Subprocess:这是一个内置的Python库,用于启动和管理子进程。它允许您运行外部命令和脚本,并将它们的结果返回给Python。

1.2. 图像识别
#定义一个人脸识别的函数
def recognize_faces():
    image_path = image_label.cget("text")
    if image_path:
        # 加载图片
        image = face_recognition.load_image_file(image_path)
        # 识别图片上所有人脸的位置
        face_locations = face_recognition.face_locations(image)

        # 读取图片用于PIL显示
        img = Image.open(image_path)
        # 创建一个可以在PIL中绘制的图像
        draw = ImageDraw.Draw(img)

        # 在每个人脸周围画框
        for face_location in face_locations:
            top, right, bottom, left = face_location
            draw.rectangle(((left, top), (right, bottom)), outline=(255, 255, 255))

        # 如果识别到人脸
        if face_locations:
            # 裁剪人脸区域
            face_imgs = []
            for face_location in face_locations:
                top, right, bottom, left = face_location
                face_img = img.crop((left, top, right, bottom))
                face_imgs.append(face_img)

            # 显示第一个识别到的人脸
            if face_imgs:
                face_img = face_imgs[0]
                # 调整图片大小以适应窗口
                face_img=face_img.resize((400,300), Image.LANCZOS)
                # 创建ImageTk对象
                face_imgTk = ImageTk.PhotoImage(face_img)
                # 更新图像标签
                processed_image_label.config(image=face_imgTk)
                processed_image_label.image = face_imgTk
        else:
            # 弹窗提示
            messagebox.showinfo("提示", "未识别到人脸,请更换照片")

:函数recognize_faces的作用是加载一个图片,使用face_recognition库来识别图片中的人脸位置,并在图片上画出这些人脸的矩形框。如果识别到人脸,它还会裁剪出这些人脸区域,调整图片大小以适应窗口,并将裁剪后的图片显示在另一个标签上。如果未识别到人脸,它会弹出一个消息框提示用户更换照片。

1.3.创建返回功能
def return_to_rlsb():
    # 获取当前Python解释器的路径
    python_exe = sys.executable
    # 使用subprocess.Popen启动rlsb.py脚本
    subprocess.Popen([python_exe, "C:/Users/HUAWEI/PycharmProjects/pythonProject1/人脸识别/机器学习的人脸识别/rlsb.py"])
    # 销毁当前窗口
    root.destroy()

:这段代码定义了一个函数return_to_rlsb,其作用是关闭当前的Tkinter窗口,并启动一个新的Python解释器来运行另一个脚本rlsb.py,用于创建一个简单的退出或返回功能,允许用户关闭当前窗口并运行其他脚本。在图形用户界面应用程序中,这可能是一个返回按钮的功能,当用户点击该按钮时,它会关闭当前窗口并启动另一个应用程序或脚本。

1.4.创建人脸提取界面窗口
# 创建主窗口
root = tk.Tk()
root.title('人脸提取')

# 设置窗口大小
root.geometry('700x400')

# 加载背景图
background_image = Image.open('人脸提取background.jpg')
background_image=background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)

# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)

:这段代码的作用是创建一个Tkinter主窗口,并设置窗口标题和大小。然后,它加载了一个背景图片,调整了图片的大小以适应窗口,并将调整后的图片作为背景添加到窗口中。
背景图片
在这里插入图片描述

1.5.创建按钮
# 创建按钮并添加到窗口中
select_button = tk.Button(root, text='选择图片', command=select_image, width=10, height=1, bg='gray').place(x=120, y=10)
start_button= tk.Button(root, text='开始提取', command=recognize_faces, width=10, height=1, bg='gray').place(x=530, y=10)
back_button = tk.Button(root, text='返回', command=return_to_rlsb, width=10, height=1, bg='gray').place(x=330, y=365)

# 原始图像标签
image_label = tk.Label(root, text="", image="")
image_label.pack(side=tk.LEFT, padx=10, pady=10)

# 处理后的图像标签
processed_image_label = tk.Label(root, text="", image="")
processed_image_label.pack(side=tk.RIGHT, padx=10, pady=10)

:这段代码的作用是在Tkinter主窗口中添加三个按钮和一个标签,用于选择图片、开始提取人脸、返回上一个界面,以及显示原始图像和处理后的图像。

1.6.显示窗口
# 显示窗口
root.mainloop()

运行结果
在这里插入图片描述

2.人脸识别

2.1.导入资源包
Import tkinter as tk
from tkinter import filedialog
import face_recognition
import os
from PIL import Image, ImageTk
import subprocess
import sys

:导入了Tkinter库以及与图像处理和人脸识别相关的其他库,可以帮助我们处理图形界面、图像处理、操作系统交互等多种任务。

2.2.识别图片中人脸的位置
# 人脸识别函数
def recognize_faces(image_path):
    # 加载图片
    image = face_recognition.load_image_file(image_path)
    # 识别图片上所有人脸的位置
    face_locations = face_recognition.face_locations(image)
    return face_locations

:函数recognize_faces的作用是加载一个图片,并使用face_recognition库来识别图片中的人脸位置。

2.3.允许用户上传图片,然后显示选中的图像
# 选择图片函数
def select_image():
    # 打开文件对话框,让用户选择图像文件
    image_path=filedialog.askopenfilename(initialdir="faceimage", filetypes=[("Image Files", "*.png *.jpg *.jpeg *.bmp")])
    if image_path:
        img = Image.open(image_path)
        img = img.resize((300, 250), Image.LANCZOS)  # 调整图片大小
        img = ImageTk.PhotoImage(img)
        image_label.config(image=img)
        image_label.image = img  # 保留对图像的引用
        image_label_path.config(text=image_path)

:函数select_image的作用是打开一个文件对话框,让用户选择一个图像文件,然后将选中的图像显示在一个标签上。

2.4.开始识别过程并显示识别结果
# 开始识别函数
def start_recognition():
    image_path = image_label_path.cget("text")
    if image_path:
        face_locations = recognize_faces(image_path)
        if face_locations:
            # 获取图片名字作为人脸信息
            image_name = os.path.basename(image_path)
            # 更新识别结果文本
            recognized_label.config(text=f"检测到人脸!!!")

            recognized_label.config(text=f"检测到人脸!!!\n人脸属于:{image_name}")
        else:
            recognized_label.config(text="未检测到人脸")

:定义了一个函数start_recognition,其作用是开始人脸识别过程,并在图形用户界面中显示识别结果。

2.5.运行返回功能
def return_to_rlsb():
    # 获取当前Python解释器的路径
    python_exe = sys.executable
    # 使用subprocess.Popen启动rlsb.py脚本
    subprocess.Popen([python_exe, "C:/Users/HUAWEI/PycharmProjects/pythonProject1/人脸识别/机器学习的人脸识别/rlsb.py"])
    # 销毁当前窗口
    root.destroy()

:创建一个简单的退出或返回功能,允许用户关闭当前窗口并运行其他脚本。在图形用户界面应用程序中,这可能是一个返回按钮的功能,当用户点击该按钮时,它会关闭当前窗口并启动另一个应用程序或脚本。

2.6.创建窗口及相应的按钮
# 创建主窗口
root = tk.Tk()
root.title('人脸识别系统')

# 设置窗口大小
root.geometry('700x500')

# 加载背景图
background_image = Image.open('人脸识别background.jpg')
background_image=background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)

# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)

# 创建按钮并添加到窗口中
select_button = tk.Button(root, text='选择图片', command=select_image, width=10, height=1, bg='gray').place(x=150, y=10)

start_button=tk.Button(root, text='开始识别', command=start_recognition, width=10, height=1, bg='gray').place(x=500, y=10)

back_button=tk.Button(root, text='返回', command=return_to_rlsb, width=10, height=1, bg='gray').place(x=300, y=400)

# 图像路径标签
image_label_path = tk.Label(root, text="")
image_label_path.pack(side=tk.BOTTOM, anchor=tk.CENTER, pady=10)

# 图像显示标签
image_label = tk.Label(root, text="", image="")
image_label.pack(side=tk.LEFT, anchor=tk.CENTER, padx=10)

# 识别结果标签
recognized_label = tk.Label(root, text="", font=("Helvetica", 16))
recognized_label.pack(side=tk.RIGHT, anchor=tk.CENTER, padx=10)

# 显示窗口
root.mainloop()

:这段代码创建了一个Tkinter主窗口,用于人脸识别系统。它包含一个背景图片、三个按钮、三个标签,以及用于显示图片的标签。
运行结果
在这里插入图片描述

3.特征标注

3.1.导入资源包
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk, ImageDraw
import face_recognition
import os
import subprocess
import sys


Image模块用于打开、编辑和保存图像。
ImageTk模块用于将PIL的Image对象转换为Tkinter可以使用的PhotoImage对象。
ImageDraw模块用于在图像上绘制形状和文本。
filedialog模块提供了文件对话框的功能,允许用户选择文件或文件夹。

3.2.识别并绘制五官
# 人脸识别函数
def recognize_faces(image_path):
    # 加载图片
    image = face_recognition.load_image_file(image_path)
    # 识别图片上所有人脸的位置
    face_locations = face_recognition.face_locations(image)
    # 识别图片上所有人脸的五官位置
    face_landmarks_list = face_recognition.face_landmarks(image)

    # 读取图片用于PIL显示
    img = Image.open(image_path)
    # 创建一个可以在PIL中绘制的图像
    draw = ImageDraw.Draw(img)

    # 在每个人脸周围画框并在五官位置画点
    forface_location,face_landmarks in zip(face_locations, face_landmarks_list):
        top, right, bottom, left = face_location
        draw.rectangle(((left, top), (right, bottom)), outline=(255, 0, 0))

        # 在五官位置画点
        for facial_feature in face_landmarks.keys():
            for point in face_landmarks[facial_feature]:
                draw.ellipse((point[0], point[1], point[0]+2, point[1]+2), fill=(0, 255, 0))

    # 如果没有识别到人脸
    if not face_locations:
        # 弹窗提示
        messagebox.showinfo("提示", "未识别到人脸,请更换照片")

    else:
        # 调整图片大小以适应窗口
        img = img.resize((480, 330), Image.LANCZOS)
        # 创建ImageTk对象
        imgTk = ImageTk.PhotoImage(img)
        # 更新图像标签
        image_label.config(image=imgTk)
        image_label.image = imgTk

:函数recognize_faces的作用是加载一个图片,使用face_recognition库来识别图片中的人脸位置和五官位置,并在图片上绘制人脸框和五官点。如果图片中没有人脸,它会弹出一个提示框。
背景颜色
在这里插入图片描述

3.3.打开文件夹选择图片
# 选择图片函数
def select_image():
    # 打开文件对话框,让用户选择图像文件
    image_path = filedialog.askopenfilename(initialdir="faceimage")
    if image_path:
        # 确保图像路径正确
        if os.path.isfile(image_path):
            # 显示图片路径
            image_label.config(text=image_path)
            # 使用PIL读取图片
            img = Image.open(image_path)
            # 调整图片大小以适应窗口
            img = img.resize((480, 330), Image.LANCZOS)
            # 创建ImageTk对象
            imgTk = ImageTk.PhotoImage(img)
            # 更新图像标签
            image_label.config(image=imgTk)
            image_label.image = imgTk
        else:
            messagebox.showerror("错误", "无法打开文件。请确认文件路径正确。")

:函数select_image的作用是打开一个文件对话框,让用户选择一个图像文件,并确保图像路径正确。如果用户选择了正确的文件,它会显示图片路径并显示图片。如果文件路径不正确,它会弹出一个错误消息框。

3.4.开始识别并显示识别结果
# 开始识别函数
def start_recognition():
#获取图片路径
    image_path = image_label.cget("text")
#检查是否选择了文件
    if image_path:
调用recognize_faces(image_path)函数以识别人脸五官位置,并在图片上绘制人脸框和五官点
        recognize_faces(image_path)

:函数start_recognition的作用是开始人脸识别过程,并在图形用户界面中显示识别结果。

3.5.返回主界面
def return_to_rlsb():
    # 获取当前Python解释器的路径
    python_exe = sys.executable
    # 使用subprocess.Popen启动rlsb.py脚本
    subprocess.Popen([python_exe, "D:/python lesson/机器学习的人脸识别/rlsb.py"])
    # 销毁当前窗口
    root.destroy()

:这个函数通常用于创建一个简单的退出或返回功能,允许用户关闭当前窗口并运行其他脚本。在图形用户界面应用程序中,这可能是一个返回按钮的功能,当用户点击该按钮时,它会关闭当前窗口并启动另一个应用程序或脚本。

3.6.创建窗口和按钮
# 创建主窗口
root = tk.Tk()
root.title('特征标注')

# 设置窗口大小
root.geometry('500x400')

# 加载背景图
background_image = Image.open('特征标注background.png')
background_image = background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)

# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)

# 创建按钮并添加到窗口中
select_button = tk.Button(root, text='选择图片', command=select_image, width=10, height=1, bg='gray').place(x=80, y=1)
start_button=tk.Button(root, text='开始识别', command=start_recognition, width=10, height=1, bg='gray').place(x=350, y=1)
back_button = tk.Button(root, text='返回', command=return_to_rlsb, width=10, height=1, bg='gray').place(x=218, y=365)

# 图像路径标签
image_label = tk.Label(root, text="", image="")
image_label.pack(side=tk.LEFT, padx=10, pady=10)

# 显示窗口
root.mainloop()

:这个代码片段创建了一个Tkinter主窗口,用于进行特征标注。它定义了窗口的标题、大小、背景图片、按钮以及图像路径标签。当用户点击按钮时,相应的函数会被调用。
运行结果
在这里插入图片描述

4.创建人脸识别系统的主界面

4.1.导入资源包
import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import Image, ImageTk
import os

:这个代码片段是Python脚本的导入部分,它导入了多个库和模块,以便在后续的代码中使用它们的功能。

4.2.创建窗口大小
# 创建主窗口
root = tk.Tk()
root.title('人脸识别系统')

:这个代码片段通常用于创建一个Tkinter窗口,并为其设置一个标题和一个初始大小。在后续的代码中,您可以添加更多的组件,如按钮、标签、图像等,来构建图形用户界面。

4.3.创建按钮和加载背景图片
# 创建标题并居中
title_label = tk.Label(root, text='动态人脸识别', font=('Arial', 16))
title_label.pack(pady=10)

# 加载背景图
background_image = Image.open('rlsbbackground.jpg')
background_image = background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)

# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)

# 构建人脸识别脚本的相对路径
face_recognition_script = os.path.join('机器学习的人脸识别', '静态人脸识别', '人脸识别.py')

button1 = tk.Button(root, text='人脸识别', command=lambda: [subprocess.Popen(["python", "静态人脸识别/人脸提取.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button1.pack(padx=5, pady=1, anchor='center')

button2 = tk.Button(root, text='人脸提取', command=lambda: [subprocess.Popen(["python", "静态人脸识别/人脸提取.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button2.pack(padx=5, pady=1, anchor='center')

button3 = tk.Button(root, text='特征标注', command=lambda: [subprocess.Popen(["python", "静态人脸识别/特征标注.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button3.pack(padx=5, pady=1, anchor='center')

button4 = tk.Button(root, text='摄像头识别', command=lambda: [subprocess.Popen(["python", "动态人脸识别/摄像头人脸识别/aisb3.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button4.pack(padx=5, pady=1, anchor='center')

button5 = tk.Button(root, text='视频流识别', command=lambda: [subprocess.Popen(["python", "动态人脸识别/视频流人脸识别/视频流.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button5.pack(padx=5, pady=1, anchor='center')

button6 = tk.Button(root, text='退出', command=lambda: on_closing(), width=10, height=2)
button6.pack(padx=5, pady=5, anchor='center')

:这个代码片段通常用于创建一个具有标题、背景图片和按钮的Tkinter窗口,用户可以选择执行不同的人脸识别任务,如人脸识别、人脸提取、特征标注等。当用户点击“退出”按钮时,窗口会被关闭。
背景图片
在这里插入图片描述

4.4.定义退出程序,可以实现返回功能
# 定义退出程序函数
def on_closing():
    if messagebox.askokcancel("退出", "确定要退出吗?"):
        root.destroy()

# 设置窗口关闭事件
root.protocol("WM_DELETE_WINDOW", on_closing)

# 显示窗口
root.mainloop()

:这个代码片段通常用于创建一个具有退出功能的Tkinter窗口,当用户尝试关闭窗口时,会弹出一个确认对话框,询问是否确定要退出。如果用户确认,窗口将被关闭。
运行结果
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Docker+Jenkins实现自动部署SpringBoot+Maven项目

安装Docker随便根据其他教程安装即可,本文着重讲jenkins的安装与环境配置。 一、安装jenkins 1.运行命令搜索Jenkins docker search jenkins deprecated 是弃用的意思,第一条搜索记录就是告诉我们 jenkins 镜像已经弃用,让我们使用 jenkins…

ardupilot开发 --- 机载计算机-软件方案 篇

马儿跑马儿不吃草 0. 概述APSyncBlueOSDroneKitFlytOSMaverickROSRpanion-server结论 0. 概述 The Companion Computer software refers to the programs and tools that run on the Companion Computer. They will take in MAVLink telemetry from the Flight Controller and…

IGraph使用实例——图属性创建1

1 概述 在图论中,图由顶点(vertices)和边(edges)组成,可以是无向的或有向的。图的属性是用来提供关于图、顶点或边的额外信息的数据。以下是从图论角度对图的属性的描述: 图的属性&#xff08…

C++:特殊类设计和四种类型转换

一、特殊类设计 1.1 不能被拷贝的类 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98: 1、将拷贝构造函数与赋值运算符重载只…

个人百度百科怎么创建

编辑百度词条是一个相对简单的流程,但需要注意的是,并不是所有的词条都可以编辑,部分锁定的词条是无法编辑的,但可以通过官方平台申请解封。以下百科优化网yajje分享是详细的步骤: 注册百度账号 首先,用户…

kernelbase.dll故障怎么处理的几种常见方法,有效的解决kernelbase.dll故障

kernelbase.dll是 Windows 操作系统的一个系统文件,它是 Windows NT 基本 API 客户端库的一部分。如果你遇到了kernelbase.dll出现故障的情况,这可能会导致软件崩溃或无法正常运行。下面是一些处理kernelbase.dll故障的常见方法。 重新启动计算机&#x…

企业百度百科词条怎么修改

企业百度百科词条的修改是提升企业网络形象的重要手段。以下是百科优化网yajj总结详细的修改步骤: 准备工作 注册并登录百度账号:这是进行词条编辑的前提]。熟悉百度百科编辑规则:了解内容要求、格式规范、参考资料等,有助于更好…

深入解析 Web 开发中的强缓存与协商缓存机制

在 Web 开发中,缓存机制是提高页面加载速度和用户体验的重要技术。缓存分为两种主要类型:强缓存和协商缓存。本文将详细介绍这两种缓存机制的原理、实现方式及其区别,并演示如何在 <meta> 元素中和 Nginx 服务器中进行缓存控制。 强缓存 强缓存(Strong Caching)是指…

气泡式水位计施工技术要求

1、气泡式水位计压力气管出气口应安装并固定在最低水位处&#xff0c;其压力气管也应固定&#xff0c;有条件的可用金属管或塑料管保护。气泡式水位计安装示意图见附图。 2、安装要求 1&#xff09;检查气泡式水位计气管外观有无破损及变形&#xff1b; 2&#xff09;旋开带有…

【c++进阶(二)】STL之string类的模拟实现

&#x1f493;博主CSDN主页:Am心若依旧&#x1f493; ⏩专栏分类c从入门到精通⏪ &#x1f69a;代码仓库:青酒余成&#x1f69a; &#x1f339;关注我&#x1faf5;带你学习更多c   &#x1f51d;&#x1f51d; 1.前言 本章重点 本章主要介绍一些关键接口的模拟实现&#xff…

Simulink从0搭建模型09-P10 各类常用子系统介绍

Simulink从0搭建模型09-P10 各类常用子系统介绍 今日学习内容1. 使能子系统 Enabled Subsystem2. 触发子系统 Triggered Subsystem3. 函数调用子系统 Function-Call Subsystem3.1. 使用Function-Call Generator 产生一个f()信号3.2. 使用Stateflow产生f()一个信号3.2.1. Chart模…

CentOS 7~9 救援模式恢复root密码实战指南

在管理Linux服务器时&#xff0c;忘记root密码是一件棘手的事情&#xff0c;但幸运的是&#xff0c;CentOS提供了救援模式来帮助我们重置root密码。本文将详细介绍如何通过GRUB引导菜单进入紧急模式&#xff08;或称为救援模式&#xff09;&#xff0c;进而恢复root用户的密码。…

政安晨【零基础玩转各类开源AI项目】:解析开源项目:Champ 利用三维参数指导制作可控且一致的人体图像动画

目录 论文题目 Champ: 利用三维参数指导制作可控且一致的人体图像动画 安装 创建 conda 环境&#xff1a; 使用 pip 安装软件包 推理 1. 下载预训练模型 2. 准备准备引导动作数据 运行推理 训练模型 准备数据集 运行训练脚本 数据集 政安晨的个人主页&#xff1a;…

Stable diffusion文生图大模型——隐扩散模型原理解析

1、前言 本篇文章&#xff0c;我们将讲这些年非常流行的文生图大模型——Stable Diffusion。该模型也不难&#xff0c;甚至说很简单。创新点也相对较少&#xff0c;如果你学会了我以前的文章讲过的模型&#xff0c;学习这个也自然水到渠成&#xff01; 参考论文&#xff1a;H…

JVM-JAVA-双亲委派机制

双亲委派机制 双亲委派机制Tomcat打破双亲委派机制 双亲委派机制 双亲委派机制&#xff0c;加载某个类时会先委托父加载器寻找目标类&#xff0c;找不到再委托上层父加载器加载&#xff0c;如果所有父加载器在自己的加载类路径下都找不到目标类&#xff0c;则在自己的类加载路径…

Docker 基础使用 (1) 使用流程概览

文章目录 Docker 软件安装Docker 镜像仓库Docker 仓库指令Docker 镜像指令Docker 容器指令Docker 使用实例 —— 搭建 nginx 服务nginx 概念nginx 使用用 docker 启动 nginx Docker 基础使用&#xff08;0&#xff09;基础认识 Docker 基础使用 (1) 使用流程概览 Docker 基础使…

PHPStudy(xp 小皮)V8.1.1 通过cmd进入MySQL命令行模式

PHPStudy是一个PHP开发环境集成包&#xff0c;可用在本地电脑或者服务器上&#xff0c;该程序包集成最新的PHP/MySql/Apache/Nginx/Redis/FTP/Composer&#xff0c;一次性安装&#xff0c;无须配置即可使用。MySQL MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL A…

【C++入门到精通】C++ thread线程库 [ C++入门 ]

阅读导航 引言一、thread类的简单介绍二、thread类的用法1. 创建线程2. 使用 Lambda 表达式3. 传递参数给线程4. 线程的 join 和 detach5. 检查线程是否可 join6. 线程的 ID7. 线程的移动语义8. 线程的析构&#x1f6a8; 注意事项 三、线程函数参数温馨提示 引言 C thread线程…

代码随想录第二十三天 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236.二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 看完想法&#xff1a;需要熟悉一下双指针的操作&#xff0c;好久没复习了&#xff0c;优先掌握递归 遇到在二叉搜索树上求什么最值&#xff0c;求差值之类的&#xff0c;都要思考一下二叉搜索树可是有序的&#xff0c;要利用好这一特点&#xff0…

el-date-picker选择开始日期的近半年

<el-date-pickerv-model"form[val.key]":type"val.datePickerType || daterange":clearable"val.clearable && true"range-separator"~"start-placeholder"开始日期"end-placeholder"结束日期"style&q…