基于opencv的人脸闭眼识别疲劳监测
1. 项目简介
本项目旨在实现基于眼部特征的眨眼检测,通过监测眼睛开闭状态来计算眨眼次数,从而应用于疲劳监测、注意力检测等场景。使用了面部特征点检测算法,以及眼部特征比率(EAR, Eye Aspect Ratio)来判断眼睛的闭合状态。当EAR值低于设定的阈值时,系统判定为眨眼。整个项目采用了Dlib库进行面部特征点定位,并使用OpenCV进行视频流的实时处理和可视化。通过设定合适的阈值和连续帧数参数,该模型能够准确判断并统计眨眼次数。该项目适用于基于视频流的实时眨眼检测场景,并可进一步扩展到疲劳驾驶检测、医疗健康监测以及基于表情的交互应用中。

2.技术创新点摘要
- 基于面部特征点的眼部状态检测: 代码使用Dlib库进行面部特征点检测,并通过预测68个关键点来定位眼部区域。该方法能够精确定位每个关键点的位置,确保眼部区域的检测具有较高的准确性。相比于传统的基于像素的眼部检测方法,这种基于特征点的方式更加鲁棒,能够在不同光照、角度和面部姿态下保持稳定的检测效果。
- 提出眼部特征比率(EAR)的判定机制: 项目中定义了眼部特征比率(EAR, Eye Aspect Ratio),通过计算眼部竖直方向的两个特征点距离与水平方向的距离比值,动态反映眼睛的开闭状态。这一比率的设计能够在眨眼时有效地捕捉眼部变化,并且与传统的基于面积或形状的检测方法相比,受噪声干扰较小。同时,EAR的阈值判定法具有较强的普适性,不同用户仅需微调参数即可适应多种应用场景。
- 实时眨眼检测与连续帧闭合判定: 在项目中,通过实时视频流获取用户眼部图像并进行处理,利用EAR值与预设阈值进行实时判定。创新地引入了“连续帧闭合判定”机制,即只有当眼部EAR值连续多帧低于设定阈值时,才计为一次有效的眨眼行为。该机制避免了因瞬时噪声或轻微眼部动作(如快速眨眼或眼球移动)引起的误判,提升了检测的精度和可靠性。
- 可视化与交互设计: 该项目在实时检测过程中提供了可视化展示,包括眨眼次数统计、EAR值的动态变化以及眼部轮廓的实时标注。通过这种可视化方式,用户能够直观地了解系统的检测状态,从而提升了模型的可解释性与交互体验。
3. 数据集与预处理
本项目的眨眼检测主要依赖于视频流数据和面部特征点检测模型进行实时处理,因此数据集以动态视频帧为主,并通过Dlib提供的预训练面部特征点模型来提取特征。视频源可以是实时摄像头输入或预录制的视频文件,通过OpenCV进行逐帧处理。该项目不直接使用大规模的图像数据集,而是通过Dlib模型的shape_predictor_68_face_landmarks.dat权重文件来对面部进行特征点定位。特征点数据能够精准定位眼睛、嘴巴、鼻子等关键面部区域,因此,项目中没有传统数据集的标注步骤,而是基于特征点模型的输出进行二次处理。
在数据预处理方面,该项目采取了以下步骤:
- 图像尺寸调整: 每帧图像在输入时会被统一调整到指定大小(宽度1200像素),保证所有帧的尺度一致,从而避免因不同视频分辨率带来的计算误差。此外,项目通过OpenCV对帧数据进行灰度化处理,减少色彩冗余,提升检测速度和准确性。
- 面部特征点提取: 使用Dlib的面部检测器(
detector = dlib.get_frontal_face_detector())来检测每一帧中的人脸区域,并通过68个面部特征点预测模型(shape_predictor)提取关键点坐标,主要关注眼部区域的特征点。然后将提取的特征点转换为Numpy数组格式,便于后续计算和处理。 - 眼部区域特征工程: 项目中定义了眼部特征比率(EAR)作为核心判定特征。通过计算左眼和右眼的竖直与水平距离比率,并进一步结合两眼的平均值来判断眼部状态。EAR特征能够有效区分眨眼和非眨眼状态,是项目的重要特征工程步骤。
4. 模型架构
- 模型结构的逻辑
本项目主要使用传统的计算机视觉方法,而非典型的深度学习神经网络模型。其核心检测部分依赖于基于Dlib库的面部特征点检测算法,并未使用典型的卷积神经网络(CNN)或循环神经网络(RNN)模型。项目的关键算法部分包括以下结构逻辑:
- 面部特征点检测模型: 使用Dlib的
shape_predictor来检测面部的68个关键点,该模型是基于监督学习的回归树(Regression Trees)算法实现的。它通过逐步调整面部区域的坐标,最终确定68个特征点的精确位置。模型输入为图像的灰度值矩阵,输出为面部68个关键点的二维坐标。 - 眼部特征比率(Eye Aspect Ratio, EAR)计算: 通过面部特征点定位获取眼部区域(左眼和右眼各6个点),定义竖直方向上的点对距离为 A 和 B,水平方向的点对距离为 C。具体公式如下:
A = ( x 2 − x 6 ) 2 + ( y 2 − y 6 ) 2 A = \sqrt{(x_2 - x_6)^2 + (y_2 - y_6)^2} A=(x2−x6)2+(y2−y6)2
B = ( x 3 − x 5 ) 2 + ( y 3 − y 5 ) 2 B = \sqrt{(x_3 - x_5)^2 + (y_3 - y_5)^2} B=(x3−x5)2+(y3−y5)2
C = ( x 1 − x 4 ) 2 + ( y 1 − y 4 ) 2 C = \sqrt{(x_1 - x_4)^2 + (y_1 - y_4)^2} C=(x1−x4)2+(y1−y4)2
其中,(x1,y1) 到 (x6,y6) 表示眼睛周围的6个关键点。眼部特征比率(EAR)的定义如下:
E A R = A + B 2 × C EAR = \frac{A + B}{2 \times C} EAR=2×CA+B
EAR值反映了眼睛的开合状态,当EAR值低于某个设定的阈值时,即判断为眨眼状态。
- 阈值判定与计数机制: 在模型中设定了两个关键参数:EAR阈值(
EYE_AR_THRESH = 0.3)和连续帧计数阈值(EYE_AR_CONSEC_FRAMES = 3)。当EAR值低于0.3且连续低于3帧时,系统会判定为一次有效的眨眼行为,并在计数器中累加。
整体来看,本项目的结构较为简单,主要由图像预处理、面部特征点检测、EAR值计算、阈值判定、以及可视化输出几个步骤组成。所有这些步骤在代码中被集成在同一个脚本中,以逐帧的方式处理视频流。
- 模型的整体训练流程与评估指标
由于本项目并非深度学习模型,因此没有典型的训练流程和神经网络的训练阶段。相反,它主要依赖于预训练的Dlib面部特征点检测模型(shape_predictor_68_face_landmarks.dat),该模型本身已经通过大规模的人脸关键点数据集进行训练。
项目的整体工作流程如下:
- 模型加载与参数初始化: 首先通过Dlib加载面部特征点检测模型,并初始化EAR阈值与连续帧检测参数。
- 视频流逐帧处理: 从输入视频或实时摄像头中逐帧读取图像,并转换为灰度图以提升检测速度。
- 面部特征点检测: 使用Dlib模型在每一帧中检测人脸,并定位眼部的6个关键点坐标。
- EAR值计算与判定: 基于提取的眼部特征点,逐帧计算EAR值,并与预设阈值进行比较,判断当前帧是否为眨眼状态。
- 眨眼次数统计与可视化: 当连续帧数低于阈值时,判定为一次眨眼,并在总次数上累加,同时在图像中实时显示眨眼次数。
评估指标:
该项目没有传统模型训练的评估指标,如损失函数或精确度,但可通过以下两个指标来评估其效果:
- 眨眼检测准确率: 即检测到的眨眼次数与实际眨眼次数的比例。
- 误报率(False Positive Rate, FPR): 系统误判为眨眼的帧数与总检测帧数的比例。
5. 核心代码详细讲解
1. 面部特征点定位与初始化
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])
详细解释:
detector = dlib.get_frontal_face_detector(): 这行代码使用dlib的内置函数get_frontal_face_detector()加载一个预训练的人脸检测器。该检测器采用基于方向梯度直方图(HOG, Histogram of Oriented Gradients)和线性分类器的方法来快速定位图像中的人脸位置,返回的是一个detector对象。这个对象用于检测输入图像中的人脸区域。predictor = dlib.shape_predictor(args["shape_predictor"]): 该行代码加载了预训练的面部特征点模型shape_predictor。这个模型通常是shape_predictor_68_face_landmarks.dat文件,用于检测人脸中的68个关键点(例如眼睛、鼻子、嘴巴、下巴等位置)。它将返回一个predictor对象,该对象可用于进一步获取每个面部特征点的坐标。
2. EAR(眼部特征比率)计算函数
def eye_aspect_ratio(eye):A = dist.euclidean(eye[1], eye[5])B = dist.euclidean(eye[2], eye[4])C = dist.euclidean(eye[0], eye[3])ear = (A + B) / (2.0 * C)return ear
详细解释:
def eye_aspect_ratio(eye): 定义了一个名为eye_aspect_ratio的函数,该函数用于计算眼睛的特征比率(EAR)。它的输入参数eye是一个包含6个面部关键点坐标的列表,表示当前帧中检测到的一个眼部区域。A = dist.euclidean(eye[1], eye[5]): 使用scipy.spatial.distance模块中的euclidean函数计算眼部竖直方向上两个点(第2个点和第6个点)之间的欧氏距离。该值存储在变量A中。B = dist.euclidean(eye[2], eye[4]): 计算竖直方向上另一对点(第3个点和第5个点)之间的距离,并存储在变量B中。C = dist.euclidean(eye[0], eye[3]): 计算水平方向上两个端点(第1个点和第4个点)之间的距离,并存储在变量C中。ear = (A + B) / (2.0 * C): 根据EAR公式 EAR=A+B2×C\text{EAR} = \frac{A + B}{2 \times C}EAR=2×CA+B 计算眼睛的特征比率。该比率反映了眼睛的开闭程度,EAR值越低表示眼睛越闭合。return ear: 返回当前眼部区域的EAR值。
3. 逐帧处理与眼部状态判断
if ear < EYE_AR_THRESH:COUNTER += 1else:if COUNTER >= EYE_AR_CONSEC_FRAMES:TOTAL += 1COUNTER = 0
详细解释:
if ear < EYE_AR_THRESH: 检查计算得到的ear值是否小于设定的阈值EYE_AR_THRESH(在代码中设定为0.3)。如果ear值小于该阈值,表示眼睛处于闭合状态。COUNTER += 1: 当眼睛处于闭合状态时,累加闭眼计数器COUNTER。这个计数器用于统计当前连续闭眼的帧数。else: 如果ear值大于或等于阈值,表示眼睛处于睁开状态,进入else分支。if COUNTER >= EYE_AR_CONSEC_FRAMES: 检查COUNTER是否大于等于设定的连续帧阈值EYE_AR_CONSEC_FRAMES(设定为3)。这表示眼睛已经连续闭合了3帧,判定为一次有效的眨眼行为。TOTAL += 1: 当满足连续闭眼帧数条件时,眨眼总数TOTAL加1。COUNTER = 0: 重置COUNTER计数器,表示从当前帧开始重新统计。
4. 实时视频流处理与展示
cv2.putText(frame, "Blinks: {}".format(TOTAL), (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
详细解释:
cv2.putText(frame, "Blinks: {}".format(TOTAL), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2): 使用 OpenCV 的putText函数在当前帧frame中显示文本信息。文本内容为当前检测到的眨眼总次数TOTAL,显示位置为图像左上角(坐标 (10, 30)),字体类型为FONT_HERSHEY_SIMPLEX,字体大小为 0.7,颜色为红色(0, 0, 255),粗细为2。cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2): 显示当前帧中计算的 EAR 值(保留两位小数),显示位置为图像的 (300, 30),格式与上一行相同。这些实时信息有助于用户直观地看到当前检测状态。
5. 视频流结束与资源释放
vs.release()
cv2.destroyAllWindows()
详细解释:
vs.release(): 释放视频流对象vs占用的资源,确保程序退出时不会发生内存泄漏或资源占用。cv2.destroyAllWindows(): 关闭所有由 OpenCV 创建的窗口。该行代码用于清理与视频流处理相关的可视化窗口,保证程序顺利退出。
6. 模型优缺点评价
优点:
- 轻量化与实时性: 本项目采用传统的计算机视觉方法(面部特征点检测与EAR值计算),而非复杂的深度学习模型,能够在普通CPU上实现实时的眨眼检测,具有较低的计算开销,适合于移动设备或嵌入式系统的应用。
- 特征工程稳定性: 通过EAR(眼部特征比率)这一简单而有效的几何特征来判断眼睛的开闭状态,避免了传统基于像素点或面积的特征易受光线和噪声干扰的问题。同时,EAR对不同用户的眼部形状具有较好的鲁棒性,适用范围广。
- 高可解释性: 使用几何比率来描述眼睛状态,模型输出的EAR值能够直接反映当前眼部状态的变化,使得模型的行为具有较高的可解释性。
缺点:
- 对人脸检测器依赖较高: 该项目依赖于Dlib的人脸检测与特征点定位模型,因此在实际应用中,人脸姿态变化、部分遮挡或光照变化会导致特征点定位不准,从而影响EAR的计算结果,导致检测精度下降。
- 缺乏深度学习特征表示: EAR值作为单一的几何特征,在处理复杂场景(如快速眨眼、疲劳检测)时可能存在误判,无法有效捕捉更多上下文信息或复杂表情。
- 缺乏适应性: EAR阈值与连续帧数阈值是通过人工设定的超参数,对不同用户或不同视频数据源的适应性差,可能需要频繁调整参数。
模型改进方向:
- 引入深度学习模型: 考虑使用卷积神经网络(CNN)或更复杂的模型(如LSTM、RNN)来捕捉视频中的时间序列特征,通过端到端训练来提升模型对复杂场景的鲁棒性。
- 改进人脸检测与特征点提取方法: 可以引入更先进的面部特征点检测模型(如OpenFace或MediaPipe),提升对不同姿态、光照和遮挡情况的检测效果。
- 参数自适应调整: 采用自适应参数调整策略,或通过深度学习模型自动学习不同用户的特征,使系统能够在不同应用场景下自我优化。
↓↓↓更多热门推荐:
transformers和bert实现微博情感分类模型提升
基于ResNet50模型的船型识别与分类系统研究
全部项目数据集、代码、教程进入官网zzgcz.com
相关文章:
基于opencv的人脸闭眼识别疲劳监测
1. 项目简介 本项目旨在实现基于眼部特征的眨眼检测,通过监测眼睛开闭状态来计算眨眼次数,从而应用于疲劳监测、注意力检测等场景。使用了面部特征点检测算法,以及眼部特征比率(EAR, Eye Aspect Ratio)来判断眼睛的闭…...
aeo认证需要什么材料
AEO(Authorized Economic Operator)认证,即经认证的经营者认证,是企业信用管理体系的一种高级认证。申请AEO认证时,企业需要准备一系列的材料以证明其符合认证标准。以下是一份详细的AEO认证申请材料清单: …...
【iOS】YYModel
目录 什么是YYModel ? 如何使用YYModel ? 最简单的Model 与网络请求结合 属性为容器类的Model 白名单和黑名单 Model的嵌套 结语 什么是YYModel ? YYModel是一个用于 iOS 和 macOS 开发的高性能的模型框架,主要用于对象和…...
Cadence元件A属性和B属性相互覆盖
最近在使用第三方插件集成到Cadence,协助导出BOM到平台上,方便对BOM进行管理和修改,结果因为属性A和属性B不相同,导致导出的BOM错误。如下图: 本来我们需要导出Q12,结果给我们导出了Q13,或者反之&…...
【火山引擎】语音合成 | HTTP接口 | 一次性合成 | python
目录 一 准备工作 二 HTTP接口(一次性合成-非流式) 1 接口说明 2 身份认证 3 请求方式 三 实践 四 注意事项 火山引擎语音合成TTS(Text-to-Speech)是一种基于云计算的语音合成服务,可以将文本转化为自然、流畅的语音。以下是火山引擎TTS的主要功能和特点: ①多种语音…...
YOLOv11改进-卷积-空间和通道重构卷积SCConv
本篇文章将介绍一个新的改进模块——SCConv(小波空间和通道重构卷积),并阐述如何将其应用于YOLOv11中,显著提升模型性能。为了减少YOLOv11模型的空间和通道维度上的冗余,我们引入空间和通道重构卷积。首先,…...
记录一次从nacos配置信息泄露到redis写计划任务接管主机
经典c段打点开局。使用dddd做快速的打点发现某系统存在nacos权限绕过 有点怀疑是蜜罐,毕竟nacos这实在是有点经典 nacos利用 老规矩见面先上nacos利用工具打一波看看什么情况 弱口令nacos以及未授权访问,看这记录估计被光顾挺多次了啊 手动利用Nacos-…...
Unity加载界面制作
效果 UI部分 结构 说下思路: 因为是加载界面,所以最上层是一个Panel阻止所有的UI交互,这个Panel如果有图片就加一个图片,如果没有可以把透明度调到最大,颜色设为黑色. 下面最核心的就是一个进度条了,有图片的话,将进度条的底放进来,将进度条锚点设为下中,将滑动块的尺寸设为0.…...
最好的ppt模板网站是哪个?做PPT不可错过的18个网站!
现在有很多PPT模板网站,但真正免费且高质量的不多,今天我就分享主流的国内外PPT模板下载网站,并且会详细分析这些网站的优缺点,这些网站都是基于个人实际使用经验的,免费站点会特别标注,让你可以放心下载&a…...
煤矿安全监测监控作业题库
第一部分 安全法律法规知识子题库 单选题 1.《安全生产法》规定,生产经营单位应当向从业人员如实告知作业场所和工作岗位存在的(A)、防范措施以及事故应急措施。 A. 危险因素 B. 人员状况 C. 设备状况 D. 环境状况 2.《安全生产法》规定&…...
【记录】Django数据库的基础操作
数据库连接 在Django中使用 mysqlclient 这个包用于数据库的连接,切换至 Django环境中直接 pip install mysqlclient 安装此包 1 数据库连接配置 在项目目录下的setting.py中配置 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mini,#数据库名US…...
XHCI 1.2b 规范摘要(五)
系列文章目录 XHCI 1.2b 规范摘要(一) XHCI 1.2b 规范摘要(二) XHCI 1.2b 规范摘要(三) XHCI 1.2b 规范摘要(四) XHCI 1.2b 规范摘要(五) 文章目录 系列文章目…...
小程序短链接生成教程
文章目录 一、小程序短链接(必须发布正式的小程序才能生成短链接!!!)二、使用步骤1.获取token信息2.获取短链接 总结 一、小程序短链接(必须发布正式的小程序才能生成短链接!!&#…...
C++进阶之路:再谈构造函数、static成员、友元(类与对象_下篇)
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
C 函数指针与回调函数
C 函数指针与回调函数 在C语言中,函数指针和回调函数是两个非常强大的概念,它们在提高代码的灵活性和模块化方面发挥着重要作用。本文将详细介绍C语言中的函数指针和回调函数,包括它们的定义、用法和实际应用场景。 函数指针 定义 函数指…...
CTF(九)
导言: 本文主要讲述在CTF竞赛网鼎杯中,web类题目AreUSerialz。 靶场链接:BUUCTF在线评测 一,分析代码。 看到了一大段php代码。 <?php// 引入flag.php文件 include("flag.php");// 高亮显示当前文件 highlight…...
三种单例实现
1、不继承Mono的单例 实现 使用 注: 使用需要继承BaseManager 泛型填写自己本身 需要实现无参构造函数 2、挂载式的Mono单例 实现 使用 注: 使用需要继承SingletonMono 泛型填写自己本身 需要挂载在unity引擎面板 3、不用挂载式的单例 实现 使…...
Spring XML配置方式和Spring Boot注解方式的详细对照关系
功能/配置项Spring XML配置方式Spring Boot注解方式定义Beanxml <bean id"myBean" class"com.example.MyBean"/>javaBeanpublic MyBean myBean() { return new MyBean(); }注入Beanxml <bean id"myBean" class"com.example.MyBea…...
leetcode 无重复字符串的排列和组合
1.题目要求: 2.题目代码: class Solution { public:vector<string> result;string str;//利用回溯去解决此问题void backtricking(string S,vector<bool>& used){if(str.size() S.size()){result.push_back(str);}//用used去掉重复的排列与组合f…...
7. 配置
三种获取配置的方法 返回 /config/config.php 、/config/autoload/xxx.php 中的值 <?php namespace App\Controller;use Hyperf\Config\Annotation\Value; use Hyperf\Contract\ConfigInterface; use Hyperf\Di\Annotation\Inject; use Hyperf\HttpServer\Annotation\AutoC…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
