大创项目推荐 深度学习 python opencv 实现人脸年龄性别识别

文章目录

  • 0 前言
  • 1 项目课题介绍
  • 2 关键技术
    • 2.1 卷积神经网络
    • 2.2 卷积层
    • 2.3 池化层
    • 2.4 激活函数:
    • 2.5 全连接层
  • 3 使用tensorflow中keras模块实现卷积神经网络
  • 4 Keras介绍
    • 4.1 Keras深度学习模型
    • 4.2 Keras中重要的预定义对象
    • 4.3 Keras的网络层构造
  • 5 数据集处理训练
    • 5.1 分为年龄、性别
    • 5.2 性别分为两类
    • 5.3性别训练代码
    • 5.4 年龄分为七个年龄段
    • 5.5 年龄训练代码
  • 6 模型验证预测
    • 6.1 实现效果
    • 6.2 关键代码
  • 7 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 基于深度学习的人脸年龄性别识别算法实现

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate


1 项目课题介绍

年龄和性别作为人重要的生物特征, 可以应用于多种场景,
如基于年龄的人机交互系统、电子商务中个性营销、刑事案件侦察中的年龄过滤等。然而基于图像的年龄分类和性别检测在真实场景下受很多因素影响,
如后天的生活工作环境等, 并且人脸图像中的复杂光线环境、姿态、表情以及图片本身的质量等因素都会给识别造成困难。

学长这次设计的项目 基于深度学习卷积神经网络,利用Tensorflow和Keras等工具实现图像年龄和性别检测。

在这里插入图片描述

2 关键技术

2.1 卷积神经网络

受到人类大脑神经突触结构相互连接的模式启发,神经网络作为人工智能领域的重要组成部分,通过分布式的方法处理信息,可以解决复杂的非线性问题,从构造方面来看,主要包括输入层、隐藏层、输出层三大组成结构。每一个节点被称为一个神经元,存在着对应的权重参数,部分神经元存在偏置,当输入数据x进入后,对于经过的神经元都会进行类似于:y=w*x+b的线性函数的计算,其中w为该位置神经元的权值,b则为偏置函数。通过每一层神经元的逻辑运算,将结果输入至最后一层的激活函数,最后得到输出output。

在这里插入图片描述

2.2 卷积层

卷积核相当于一个滑动窗口,示意图中3x3大小的卷积核依次划过6x6大小的输入数据中的对应区域,并与卷积核滑过区域做矩阵点乘,将所得结果依次填入对应位置即可得到右侧4x4尺寸的卷积特征图,例如划到右上角3x3所圈区域时,将进行0x0+1x1+2x1+1x1+0x0+1x1+1x0+2x0x1x1=6的计算操作,并将得到的数值填充到卷积特征的右上角。

在这里插入图片描述

2.3 池化层

池化操作又称为降采样,提取网络主要特征可以在达到空间不变性的效果同时,有效地减少网络参数,因而简化网络计算复杂度,防止过拟合现象的出现。在实际操作中经常使用最大池化或平均池化两种方式,如下图所示。虽然池化操作可以有效的降低参数数量,但过度池化也会导致一些图片细节的丢失,因此在搭建网络时要根据实际情况来调整池化操作。

在这里插入图片描述

2.4 激活函数:

激活函数大致分为两种,在卷积神经网络的发展前期,使用较为传统的饱和激活函数,主要包括sigmoid函数、tanh函数等;随着神经网络的发展,研宄者们发现了饱和激活函数的弱点,并针对其存在的潜在问题,研宄了非饱和激活函数,其主要含有ReLU函数及其函数变体

2.5 全连接层

在整个网络结构中起到“分类器”的作用,经过前面卷积层、池化层、激活函数层之后,网络己经对输入图片的原始数据进行特征提取,并将其映射到隐藏特征空间,全连接层将负责将学习到的特征从隐藏特征空间映射到样本标记空间,一般包括提取到的特征在图片上的位置信息以及特征所属类别概率等。将隐藏特征空间的信息具象化,也是图像处理当中的重要一环。

3 使用tensorflow中keras模块实现卷积神经网络

class CNN(tf.keras.Model):def __init__(self):super().__init__()self.conv1 = tf.keras.layers.Conv2D(filters=32,             # 卷积层神经元(卷积核)数目kernel_size=[5, 5],     # 感受野大小padding='same',         # padding策略(vaild 或 same)activation=tf.nn.relu   # 激活函数)self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)self.conv2 = tf.keras.layers.Conv2D(filters=64,kernel_size=[5, 5],padding='same',activation=tf.nn.relu)self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)self.flatten = tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,))self.dense1 = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu)self.dense2 = tf.keras.layers.Dense(units=10)def call(self, inputs):x = self.conv1(inputs)                  # [batch_size, 28, 28, 32]x = self.pool1(x)                       # [batch_size, 14, 14, 32]x = self.conv2(x)                       # [batch_size, 14, 14, 64]x = self.pool2(x)                       # [batch_size, 7, 7, 64]x = self.flatten(x)                     # [batch_size, 7 * 7 * 64]x = self.dense1(x)                      # [batch_size, 1024]x = self.dense2(x)                      # [batch_size, 10]output = tf.nn.softmax(x)return output

4 Keras介绍

keras是一个专门用于深度学习的开发软件。它的编程语言采用的为现在最流行的python语言,集成封装了CNTK,Tensorflow或者Theano深度学习框架为计算机后台进行深度建模,具有易于学习,高效编程的功能,数据的运算处理支持GPU和CPU,真正实现了二者的无缝切换。正是keras有如此特殊功能,所以它的优点有如下几个方面:

4.1 Keras深度学习模型

Keras深度学习模型可以分为两种:一种是序列模型,一种是通用模型。它们的区别在于其拥有不同的网络拓扑结构。序列模型是通用模型的一个范例,通常情况下应用比较广。每层之间的连接方式都是线性的,且在相邻的两

4.2 Keras中重要的预定义对象

Keras预定义了很多对象目的就是构造其网络结构,正是有了这么多的预定义对象才让Keras使用起来非常方便易用。研究中用的最多要数正则化、激活函数及初始化对象了。

  • 正则化是在建模时防止过度拟合的最常用且效果最有效的手段之一。在神经网络中采用的手段有权重参数、偏置项以及激活函数,其分别对应的代码是kernel_regularizier、bias_regularizier以及activity_regularizier。

  • 激活函数在网络定义中的选取十分重要。为了方便Keras预定义了丰富的激活函数,以此是适应不同的网络结构。使用激活对象的方式有两种:一个是单独定义一个激活函数层,二是通利用前置层的激活选项定义激活函数。

  • 初始化对象是随机给定网络层激活函数kernel_initializer or bias_initializer的开始值。权重初始化值好与坏直接影响模型的训练时间的长短。

4.3 Keras的网络层构造

在Keras框架中,不同的网络层(Layer)定义了神经网络的具体结构。在实际网络构建中常见的用Core Layer、Convolution
Layer、Pooling Layer、Emberdding Layer等。

在这里插入图片描述

5 数据集处理训练

该项目将采集的照片分为男女两个性别;‘0-9’, ‘10-19’, ‘20-29’, ‘30-39’, ‘40-49’, ‘50-59’,
‘60+’,七个年龄段;分别把性别和年龄段的图片分别提取出来,并保存到性别和年龄段两个文件夹下,构造如下图:

5.1 分为年龄、性别

在这里插入图片描述

5.2 性别分为两类

在这里插入图片描述

5.3性别训练代码

# ----------------------------------------------------------------------------------------------------------------------# 导入一些第三方包# ----------------------------------------------------------------------------------------------------------------------import tensorflow as tffrom nets import netEPOCHS = 40BATCH_SIZE = 32image_height = 128image_width = 128model_dir = "./models/age.h5"train_dir = "./data/age/train/"test_dir = "./data/age/test/"def get_datasets():train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 / 255.0)train_generator = train_datagen.flow_from_directory(train_dir,target_size=(image_height, image_width),color_mode="rgb",batch_size=BATCH_SIZE,shuffle=True,class_mode="categorical")test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 /255.0)test_generator = test_datagen.flow_from_directory(test_dir,target_size=(image_height, image_width),color_mode="rgb",batch_size=BATCH_SIZE,shuffle=True,class_mode="categorical")train_num = train_generator.samplestest_num = test_generator.samplesreturn train_generator, test_generator, train_num, test_num# ----------------------------------------------------------------------------------------------------------------------# 网络的初始化 ---  net.CNN(num_classes=7)# model.compile --- 对神经网络训练参数是设置 --- tf.keras.losses.categorical_crossentropy --- 损失函数(交叉熵)# tf.keras.optimizers.Adam(learning_rate=0.001) --- 优化器的选择,以及学习率的设置# metrics=['accuracy'] ---  List of metrics to be evaluated by the model during training and testing# return model --- 返回初始化之后的模型# ----------------------------------------------------------------------------------------------------------------------def get_model():model = net.CNN(num_classes=7)model.compile(loss=tf.keras.losses.categorical_crossentropy,optimizer=tf.keras.optimizers.Adam(lr=0.001),metrics=['accuracy'])return modelif __name__ == '__main__':train_generator, test_generator, train_num, test_num = get_datasets()model = get_model()model.summary()tensorboard = tf.keras.callbacks.TensorBoard(log_dir='./log/age/')callback_list = [tensorboard]model.fit_generator(train_generator,epochs=EPOCHS,steps_per_epoch=train_num // BATCH_SIZE,validation_data=test_generator,validation_steps=test_num // BATCH_SIZE,callbacks=callback_list)model.save(model_dir)# ----------------------------------------------------------------------------------------------------------------------

5.4 年龄分为七个年龄段

在这里插入图片描述

5.5 年龄训练代码

# ----------------------------------------------------------------------------------------------------------------------# 导入一些第三方包# ----------------------------------------------------------------------------------------------------------------------import tensorflow as tffrom nets import netEPOCHS = 20BATCH_SIZE = 32image_height = 128image_width = 128model_dir = "./models/gender.h5"train_dir = "./data/gender/train/"test_dir = "./data/gender/test/"def get_datasets():train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 / 255.0)train_generator = train_datagen.flow_from_directory(train_dir,target_size=(image_height, image_width),color_mode="rgb",batch_size=BATCH_SIZE,shuffle=True,class_mode="categorical")test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 /255.0)test_generator = test_datagen.flow_from_directory(test_dir,target_size=(image_height, image_width),color_mode="rgb",batch_size=BATCH_SIZE,shuffle=True,class_mode="categorical")train_num = train_generator.samplestest_num = test_generator.samplesreturn train_generator, test_generator, train_num, test_numdef get_model():model = net.CNN(num_classes=2)model.compile(loss=tf.keras.losses.categorical_crossentropy,optimizer=tf.keras.optimizers.Adam(lr=0.001),metrics=['accuracy'])return modelif __name__ == '__main__':train_generator, test_generator, train_num, test_num = get_datasets()model = get_model()model.summary()tensorboard = tf.keras.callbacks.TensorBoard(log_dir='./log/gender/')callback_list = [tensorboard]model.fit_generator(train_generator,epochs=EPOCHS,steps_per_epoch=train_num // BATCH_SIZE,validation_data=test_generator,validation_steps=test_num // BATCH_SIZE,callbacks=callback_list)model.save(model_dir)# ----------------------------------------------------------------------------------------------------------------------

6 模型验证预测

6.1 实现效果

在这里插入图片描述
在这里插入图片描述

6.2 关键代码

# ----------------------------------------------------------------------------------------------------------------------
# 加载基本的库
# ----------------------------------------------------------------------------------------------------------------------
import tensorflow as tf
from PIL import Image
import numpy as np
import cv2
import os
# ----------------------------------------------------------------------------------------------------------------------
# tf.keras.models.load_model('./model/age.h5') --- 加载年龄模型
# tf.keras.models.load_model('./model/gender.h5') --- 加载性别模型
# ----------------------------------------------------------------------------------------------------------------------
model_age = tf.keras.models.load_model('./models/age.h5')
model_gender = tf.keras.models.load_model('./models/gender.h5')
# ----------------------------------------------------------------------------------------------------------------------
# 类别名称
# ----------------------------------------------------------------------------------------------------------------------
classes_age = ['0-9', '10-19', '20-29', '30-39', '40-49', '50-59', '60+']
classes_gender = ['female', 'male']
# ----------------------------------------------------------------------------------------------------------------------
# cv2.dnn.readNetFromCaffe --- 加载人脸检测模型
# ----------------------------------------------------------------------------------------------------------------------
net = cv2.dnn.readNetFromCaffe('./models/deploy.prototxt.txt', './models/res10_300x300_ssd_iter_140000.caffemodel')
# ----------------------------------------------------------------------------------------------------------------------
# os.listdir('./images/') --- 得到文件夹列表
# ----------------------------------------------------------------------------------------------------------------------
files = os.listdir('./images/')
# ----------------------------------------------------------------------------------------------------------------------
# 遍历信息
# ----------------------------------------------------------------------------------------------------------------------
for file in files:# ------------------------------------------------------------------------------------------------------------------# image_path = './images/' + file --- 拼接得到图片文件路径# cv2.imread(image_path) --- 使用opencv读取图片# ------------------------------------------------------------------------------------------------------------------image_path = './images/' + fileprint(image_path)image = cv2.imread(image_path)# ------------------------------------------------------------------------------------------------------------------# (h, w) = image.shape[:2] --- 得到图像的高度和宽度# cv2.dnn.blobFromImage --- 以DNN的方式加载图像# net.setInput(blob) -- 设置网络的输入# detections = net.forward() --- 网络前相传播过程# ------------------------------------------------------------------------------------------------------------------(h, w) = image.shape[:2]blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0, (300, 300), 127.5)net.setInput(blob)detections = net.forward()# ------------------------------------------------------------------------------------------------------------------# for i in range(0, detections.shape[2]): --- 遍历检测结果# ------------------------------------------------------------------------------------------------------------------for i in range(0, detections.shape[2]):# --------------------------------------------------------------------------------------------------------------# confidence = detections[0, 0, i, 2] 得到检测的准确率# --------------------------------------------------------------------------------------------------------------confidence = detections[0, 0, i, 2]# --------------------------------------------------------------------------------------------------------------# if confidence > 0.85: --- 对置信度的判断# --------------------------------------------------------------------------------------------------------------if confidence > 0.85:# ----------------------------------------------------------------------------------------------------------# detections[0, 0, i, 3:7] * np.array([w, h, w, h]) --- 得到检测框的信息# (startX, startY, endX, endY) = box.astype("int") --- 将信息分解成左上角的x,y,以及右下角的x,y# cv2.rectangle --- 将人脸框起来# ----------------------------------------------------------------------------------------------------------box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])(startX, startY, endX, endY) = box.astype("int")cv2.rectangle(image, (startX, startY), (endX, endY), (0, 255, 0), 1)# ----------------------------------------------------------------------------------------------------------# 提取人脸部分区域# ----------------------------------------------------------------------------------------------------------roi = image[startY-15:endY+15, startX-15:endX+15]# ----------------------------------------------------------------------------------------------------------# Image.fromarray(cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)) --- 将opencv专程PIL格式的数据# img.resize((128, 128)) --- 改变图像的大小# np.array(img).reshape(-1, 128, 128, 3).astype('float32') / 255 --- 改变数据的形状,以及归一化处理# ----------------------------------------------------------------------------------------------------------img = Image.fromarray(cv2.cvtColor(roi, cv2.COLOR_BGR2RGB))img = img.resize((128, 128))img = np.array(img).reshape(-1, 128, 128, 3).astype('float32') / 255# ----------------------------------------------------------------------------------------------------------# 调用年龄识别模型得到检测结果# ----------------------------------------------------------------------------------------------------------prediction_age = model_age.predict(img)final_prediction_age = [result.argmax() for result in prediction_age][0]# ----------------------------------------------------------------------------------------------------------# 调用性别识别模型得到检测结果# ----------------------------------------------------------------------------------------------------------prediction_gender = model_gender.predict(img)final_prediction_gender = [result.argmax() for result in prediction_gender][0]# ----------------------------------------------------------------------------------------------------------# 将识别的信息拼接,然后使用cv2.putText显示# ----------------------------------------------------------------------------------------------------------res = classes_gender[final_prediction_gender] + ' ' + classes_age[final_prediction_age]y = startY - 10 if startY - 10 > 10 else startY + 10cv2.putText(image, str(res), (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)# ------------------------------------------------------------------------------------------------------------------# 显示# ------------------------------------------------------------------------------------------------------------------cv2.imshow('', image)if cv2.waitKey(0) & 0xFF == ord('q'):break

7 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

ElasticSearch学习篇8_Lucene之数据存储(Stored Field、DocValue、BKD Tree)

前言 Lucene全文检索主要分为索引、搜索两个过程,对于索引过程就是将文档磁盘存储然后按照指定格式构建索引文件,其中涉及数据存储一些压缩、数据结构设计还是很巧妙的,下面主要记录学习过程中的StoredField、DocValue以及磁盘BKD Tree的一些…

PyQt6 QScrollBar滚动条控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计48条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

录制第一个jmeter性能测试脚本2(http协议)_图书管理系统

我们手工编写了一个测试计划,现在我们通过录制的方式来实现那个测试计划。也就是说‘’测试计划目标和上一节类似:让5个用户在2s内登录图书管理系统,然后进入 页面进行查看。 目录 欢迎访问我的免费课程 PPT、安装包、视频应有尽有&#xff…

【微服务】Spring Aop原理深入解析

目录 一、前言 二、aop概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk代理示例 3.1.2 jdk动态代理模拟实现…

【OpenCV】 OpenCV 源码编译并实现 CUDA 加速 (Windows)

OpenCV 源码编译并实现 CUDA 加速 Windows 1. 环境准备1.1 软件环境1. 2 源码下载 2. CMake编译项目2.1 创建cmake项目2.2 设置编译配置2.3 解决异常2.3.1 文件下载异常2.3.2 解决CUDA版本异常 2.4 编译项目 3. Visual Studio 编译项目4. 项目测试5. 总结 OpenCV是一个基于Apac…

Ubuntu 常用命令之 ln 命令用法介绍

ln命令在Ubuntu系统中用于创建硬链接或符号链接。硬链接是指向文件的物理地址,而符号链接(也称为软链接)是指向文件路径的引用。 命令格式:ln [选项]... [-T] 目标(源文件) 链接(目标文件&…

【FPGA】Verilog:编码器 | 实现 4 到 2 编码器

0x00 编码器(Encoder) 编码器与解码器相反。当多台设备向计算机提供输入时,编码器会为每一个输入生成一个与设备相对应的信号,因此有多少比特就有多少输出,以数字形式表示输入的数量。 例如,如果有四个输…

NAS搭建WebDAV服务同步Zotero科研文献

文章目录 一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zotero文献库五、使用永久固定公网地址同步Zotero文献库 Zotero 是一款全能型 文献管理器,可以 存储、管理和引用文献,不但免费,功能还很强大实用。 ​ Zotero 支…

重新认识Word——尾注

重新认识Word——尾注 参考文献格式文献自动生成器插入尾注将数字带上方括号将参考文献中的标号改为非上标 多处引用一篇文献多篇文献被一处引用插入尾注有横线怎么删除?删除尾注 前面我们学习了如何给图片,公式自动添加编号,今天我们来看看毕…

LSTM ——作业

习题6-4 推导LSTM网络中参数的梯度, 并分析其避免梯度消失的效果 习题6-3P 编程实现下图LSTM运行过程 1. 使用Numpy实现LSTM算子 import numpy as np # 创建一个numpy数组x,它是一个4x4的矩阵,包含9个元素 x np.array([[1, 0, 0, 1],[3, …

Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

文章目录 前言一、实现思路二、实现原理我们可以由下图直观的感受到 N 与 L夹角越小,点积越接近(白色)1。越趋近90,点积越接近0(黑色) 三、实现URP下的菲涅尔效果1、我们新建一个Shader,修改为最…

安全密码(字符串)

#include <stdio.h> #include <stdbool.h> #include <string.h> bool is_secure_password(const char* password); int main() {int M;char password[51];// 读取输入中的密码数量 Mscanf("%d", &M);// 处理每个密码for (int i 0; i < M; …

Pytorch:Tensorboard简要学习

目录 一、TensorBoard简介二、TensorBoard的安装与启动Tensorboard的安装Tensorboard的启动 三、TensorBoard的简单使用3.1 SummaryWriter()3.2 add_scalar()和add_scalars()3.3 add_histogram()3.4 模型指标监控 四、总结参考博客 一、TensorBoard简介 TensorBoard 是Google开…

17.Oracle中instr()函数查询字符位置

1、instr()函数的格式 &#xff08;俗称&#xff1a;字符查找函数&#xff09; 格式一&#xff1a;instr( string1, string2 ) // instr(源字符串, 目标字符串) 格式二&#xff1a;instr( string1, string2 [, start_position [, nth_appearance ] ] ) // instr(源字符…

typescript使用解构传参

看下面这个函数 interface Student {id: number;name: string;class: string;sex: string;}function matriculation(student: Student) {//...}我们要调用它,就需要传递一个实现了Student约束的对象进去 interface Student {id: number;name: string;class: string;sex: string…

C语言:将三个数从大到小输出

#include<stdio.h> int main() {int a 0;int b 0;int c 0;printf("请输入abc的值&#xff1a;");scanf_s("%d%d%d", &a, &b, &c);if (b > a){int tmp a;a b;b tmp;}if (c > a){int tmp a;a c;c tmp;}if (b < c){int t…

app分发平台哪个好点?手机app应用内测分发平台支持负载均衡的重要性

随着互联网的快速发展&#xff0c;内测分发平台扮演着越来越重要的角色。而在现代应用程序的开发和运营过程中&#xff0c;负载均衡技术是不可或缺的一部分。内测分发平台支持负载均衡对于提高系统的稳定性、可靠性和性能至关重要。那么什么是负载均衡又有哪些重要性。 图片来源…

在线学习平台,云课堂云教育类网站源码,在线题库+随身携带的刷题神器+视频安装教程

源码介绍 在线题库&#xff1a;由传统的线下学习模式改为在线学习。能够实现学员在线学习、练习、考试 优点&#xff1a;方便、便宜、自我管理、选择性更多 、成人教育 &#xff08;1&#xff09;公考&#xff1a;国考、省考、事业单位… &#xff08;2&#xff09;升学&…

数据结构期末考题之001

算法复杂度就是n&#xff08;0&#xff09;

C++ Qt开发:自定义Dialog对话框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍自定义Dialog组件的常用方法及灵活运用。 在…