当前位置: 首页 > article >正文

基于dlib+OpenCV的人脸疲劳检测 + 年龄性别识别实战

一、前言在计算机视觉领域人脸相关技术一直是热门方向从人脸检测、关键点定位到疲劳检测、年龄性别识别都有着广泛的应用场景比如驾驶员疲劳监测、智能门禁、人机交互等。本文将基于dlib和OpenCV从零实现两个经典人脸应用实时人脸疲劳检测基于眼睛纵横比 EAR和年龄性别识别基于预训练 CNN 模型。二、dlib 库基础认知2.1 dlib 是什么dlib 是一个适用于 C 和 Python 的第三方开源库集成了机器学习、计算机视觉、图像处理的全套工具包支持在机器人、嵌入式设备、移动端、高性能服务器等多环境运行完全开源免费可商用是人脸相关项目的首选工具库之一。2.2 dlib vs OpenCV 人脸检测对比那么OpenCV 也有人脸检测为什么还要用 dlib这里给大家做一个直观对比OpenCV 人脸检测dlib 人脸检测优点1. CPU 实时运行速度快2. 架构简单易上手3. 支持不同比例人脸检测1. 支持正面 轻微非正面人脸2. API 语法极简调用方便3. 小遮挡场景下仍可稳定工作缺点1. 误检率高易把非人脸识别为人脸2. 仅支持正面人脸非正面效果差3. 抗遮挡能力弱1. 无法检测小脸训练数据最小人脸为 80×80小脸需自定义训练2. 检测框易缺失额头 / 下巴部分区域3. 极端非正面侧脸、俯视 / 仰视效果差追求速度用 OpenCV追求精度用 dlib两者可以根据场景灵活选择。三、dlib 安装指南很多同学在安装 dlib 时会遇到Failed building wheel for dlib的报错这里给大家两种稳定安装方法3.1 方法一pip 镜像安装直接使用国内镜像源加速安装避免网络问题pip install dlib -i https://pypi.tuna.tsinghua.edu.cn/simple注意该方法需要本地配置好 C 编译环境Visual Studio Build Tools否则会编译失败。3.2 方法二whl 文件离线安装如果编译环境有问题直接下载对应 Python 版本、系统版本的预编译 whl 文件然后执行安装。需要下载自己对应版本的比如Python3.8就是dlib-19.19.0-cp38-cp38-win_amd64.whl四、核心功能 1基于 dlib 的实时人脸疲劳检测4.1 实现原理疲劳检测的核心逻辑是眼睛纵横比Eye Aspect Ratio, EAR人眼睁开时眼睛的垂直高度和水平宽度的比值EAR较大当人眼闭合 / 半闭合疲劳状态时EAR 会显著降低。我们通过 dlib 的 68 个人脸关键点提取左右眼的 6 个关键点计算 EAR 值当 EAR 连续多帧低于阈值通常为 0.3时判定为疲劳状态发出预警。4.2 68 个人脸关键点说明dlib 的shape_predictor_68_face_landmarks.dat模型可以检测人脸的 68 个关键点其中36-41 号点右眼关键点42-47 号点左眼关键点48-67 号点嘴巴关键点可用于微笑检测等拓展功能4.3 完整代码实现import numpy as np import cv2 import dlib from sklearn.metrics.pairwise import euclidean_distances from PIL import Image, ImageDraw, ImageFont def eye_aspect_ratio(eye): # 计算眼睛纵横比EAR A euclidean_distances(eye[1].reshape(1,2), eye[5].reshape(1,2)) B euclidean_distances(eye[2].reshape(1,2), eye[4].reshape(1,2)) C euclidean_distances(eye[0].reshape(1,2), eye[3].reshape(1,2)) ear ((A B) /2.0) / C return ear def cv2AddChineseText(img, text, position, textColor(255, 0, 0), textSize50): # OpenCV绘制中文文本 if isinstance(img, np.ndarray): img Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) draw ImageDraw.Draw(img) fontStyle ImageFont.truetype(simsun.ttc, textSize, encodingutf-8) draw.text(position, text, textColor, fontfontStyle) return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) def drawEye(eye, frame): # 绘制眼睛轮廓 eyeHull cv2.convexHull(eye) cv2.drawContours(frame, [eyeHull], -1, (0, 255, 0), 2) # 初始化参数 COUNTER 0 # 连续闭眼帧数计数器 EYE_AR_THRESH 0.3 # EAR阈值 EYE_AR_CONSEC_FRAMES 50 # 连续闭眼50帧触发预警 # 加载dlib模型 detector dlib.get_frontal_face_detector() predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) # 打开摄像头 cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break # 人脸检测 faces detector(frame, 0) for face in faces: # 检测人脸关键点 shape predictor(frame, face) shape np.array([[p.x, p.y] for p in shape.parts()]) # 提取左右眼关键点 rightEye shape[36:42] leftEye shape[42:48] # 计算左右眼EAR rightEAR eye_aspect_ratio(rightEye) leftEAR eye_aspect_ratio(leftEye) ear (leftEAR rightEAR) / 2.0 # 疲劳判断 if ear EYE_AR_THRESH: COUNTER 1 # 连续闭眼50帧触发预警 if COUNTER EYE_AR_CONSEC_FRAMES: frame cv2AddChineseText(frame, !!!!!危险疲劳驾驶!!!!!, (250,250), textColor(0,0,255), textSize50) else: COUNTER 0 # 绘制眼睛轮廓 drawEye(leftEye, frame) drawEye(rightEye, frame) # 显示EAR值 info fEAR: {ear[0][0]:.2f} frame cv2AddChineseText(frame, info, (0,30), textColor(0,255,0), textSize30) cv2.imshow(Frame, frame) # 按ESC退出 if cv2.waitKey(1) 27: break # 释放资源 cv2.destroyAllWindows() cap.release()4.4代码解析def eye_aspect_ratio(eye): # 计算眼睛垂直方向两个距离 A euclidean_distances(eye[1].reshape(1,2), eye[5].reshape(1,2)) B euclidean_distances(eye[2].reshape(1,2), eye[4].reshape(1,2)) # 计算眼睛水平方向距离 C euclidean_distances(eye[0].reshape(1,2), eye[3].reshape(1,2)) # 公式(垂直平均距离) / 水平长度 ear ((A B) /2.0) / C return ear原理图解一只眼睛有6 个关键点0~5A、B垂直高度C水平宽度EAR 越小 眼睛越闭通用标准EAR 0.3 判定闭眼def cv2AddChineseText(img, text, position, textColor(255, 0, 0), textSize50): if isinstance(img, np.ndarray): # 如果是OpenCV格式 img Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # 转PIL格式 draw ImageDraw.Draw(img) fontStyle ImageFont.truetype(simsun.ttc, textSize, encodingutf-8) # 宋体 draw.text(position, text, textColor, fontfontStyle) # 写字 return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) # 转回OpenCV格式作用解决 OpenCV 不能直接显示中文的问题必须用 PIL 中转处理。def drawEye(eye, frame): eyeHull cv2.convexHull(eye) # 生成眼睛外轮廓 cv2.drawContours(frame, [eyeHull], -1, (0, 255, 0), 2) # 绿色线绘制帧数根据摄像头帧率调整一般摄像头 30 帧 / 秒50 帧 ≈ 1.6 秒闭眼 → 判定疲劳detector dlib.get_frontal_face_detector() # dlib人脸检测器 predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) # 68点模型模型加载.dat模型文件否则代码无法运行。while True: ret, frame cap.read() # 读取一帧画面 if not ret: break # 读取失败退出 faces detector(frame, 0) # 检测画面中的所有人脸 for face in faces: # 遍历每一张脸 # 1. 检测68个关键点 shape predictor(frame, face) shape np.array([[p.x, p.y] for p in shape.parts()]) # 2. 提取左右眼坐标固定索引 rightEye shape[36:42] # 右眼 leftEye shape[42:48] # 左眼 # 3. 计算双眼EAR rightEAR eye_aspect_ratio(rightEye) leftEAR eye_aspect_ratio(leftEye) ear (leftEAR rightEAR) / 2.0 # 取平均值更稳定 # 疲劳判断 if ear EYE_AR_THRESH: # 闭眼 COUNTER 1 if COUNTER EYE_AR_CONSEC_FRAMES: # 红色危险预警 frame cv2AddChineseText(frame, !!!!!危险疲劳驾驶!!!!!, (250,250), textColor(0,0,255), textSize50) else: # 睁眼 COUNTER 0 drawEye(leftEye, frame) drawEye(rightEye, frame) # 显示实时EAR值 info fEAR: {ear[0][0]:.2f} frame cv2AddChineseText(frame, info, (0,30), textColor(0,255,0), textSize30) # 显示画面 cv2.imshow(Frame, frame) # 按ESC退出 if cv2.waitKey(1) 27: break关键逻辑说明shape [36:42] 和 shape [42:48]这是 dlib 68 点中固定的眼睛索引不能改ear 平均值单眼误差大双眼平均更稳定计数器 COUNTER只有连续闭眼才累计睁眼立刻清零避免眨眼误判五、核心功能 2基于 OpenCV 的年龄性别识别5.1 实现原理年龄性别识别基于预训练的 CNN 模型参考 Levi 等人的论文《Age and Gender Classification using Convolutional Neural Networks》模型结构如下输入227×227 的人脸图像3 个卷积层 池化层 归一化2 个全连接层 Dropout输出性别2 分类/ 年龄8 分类我们直接使用预训练好的 caffemodel 模型通过 OpenCV 的 DNN 模块调用实现实时年龄性别识别。5.2 模型准备需要提前下载 4 个模型文件放到model文件夹下人脸检测模型opencv_face_detector.pbtxt、opencv_face_detector_uint8.pb年龄模型deploy_age.prototxt、age_net.caffemodel性别模型deploy_gender.prototxt、gender_net.caffemodel我已经上传了附件了5.3 完整代码实现import cv2 from PIL import Image, ImageDraw, ImageFont import numpy as np # 模型初始化 # 模型(网络模型/预训练模型):face/age/gender(脸、年龄、性别) faceProto model/opencv_face_detector.pbtxt faceModel model/opencv_face_detector_uint8.pb ageProto model/deploy_age.prototxt ageModel model/age_net.caffemodel genderProto model/deploy_gender.prototxt genderModel model/gender_net.caffemodel # 加载网络 ageNet cv2.dnn.readNet(ageModel, ageProto) # 年龄模型 genderNet cv2.dnn.readNet(genderModel, genderProto) # 性别模型 faceNet cv2.dnn.readNet(faceModel, faceProto) # 人脸检测模型 # 变量初始化 # 年龄段和性别标签 ageList [(0-2), (4-6), (8-12), (15-20), (25-32), (38-43), (48-53), (60-100)] genderList [男性, 女性] mean (78.426337603, 87.7689143744, 114.8958788766) # 模型训练时的均值用于预处理 # 自定义函数,获取人脸包围框 def getBoxes(net, frame): 获取人脸检测框的核心函数 frameHeight frame.shape[0] frameWidth frame.shape[1] # 预处理图像: 缩放、减均值 blob cv2.dnn.blobFromImage(frame, scalefactor1.0, size(300, 300), mean(104, 117, 123), swapRBTrue, cropFalse) net.setInput(blob) # 输入图片进行人脸检测 detections net.forward() # 获取检测结果 faceBoxes [] # 存储检测到的人脸框 for i in range(detections.shape[2]): confidence detections[0, 0, i, 2] # 置信度 if confidence 0.7: # 筛选置信度0.7的人脸 # 计算人脸框坐标 x1 int(detections[0, 0, i, 3] * frameWidth) y1 int(detections[0, 0, i, 4] * frameHeight) x2 int(detections[0, 0, i, 5] * frameWidth) y2 int(detections[0, 0, i, 6] * frameHeight) faceBoxes.append([x1, y1, x2, y2]) # 绘制人脸框 cv2.rectangle(frame, pt1(x1, y1), pt2(x2, y2), color(0, 255, 0), thicknessint(round(frameHeight / 150)), lineTypecv2.LINE_AA) return frame, faceBoxes # 中文文字绘制函数 def cv2AddChineseText(img, text, position, textColor(0, 255, 0), textSize30): 在图像上绘制中文文字 if isinstance(img, np.ndarray): # 转换为PIL图像 img Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) draw ImageDraw.Draw(img) # 加载系统宋体 fontStyle ImageFont.truetype(simsun.ttc, textSize, encodingutf-8) # 绘制文字 draw.text(position, text, textColor, fontfontStyle) # 转换回OpenCV格式 return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) # 主程序:打开摄像头 cap cv2.VideoCapture(0) # 调用摄像头 while True: ret, frame cap.read() if not ret: break frame cv2.flip(frame, flipCode1) # 镜像处理符合人眼习惯 # 获取人脸包围框 frame, faceBoxes getBoxes(faceNet, frame) if not faceBoxes: # 无人脸时跳过 print(当前镜头中没有人) cv2.imshow(result, frame) if cv2.waitKey(1) 27: # ESC退出 break continue # 遍历每个人脸预测年龄性别 for faceBox in faceBoxes: x1, y1, x2, y2 faceBox face frame[y1:y2, x1:x2] # 截取人脸区域 # 预处理缩放、减均值 blob cv2.dnn.blobFromImage(face, scalefactor1.0, size(227, 227), meanmean) # 预测性别 genderNet.setInput(blob) genderOuts genderNet.forward() gender genderList[genderOuts[0].argmax()] # 预测年龄 ageNet.setInput(blob) ageOuts ageNet.forward() age ageList[ageOuts[0].argmax()] # 绘制结果 result f{gender},{age} frame cv2AddChineseText(frame, result, (x1, y1-30), (0, 255, 0), 30) # 显示结果 cv2.imshow(result, frame) # ESC退出 if cv2.waitKey(1) 27: break # 释放资源 cv2.destroyAllWindows() cap.release()5.4代码解析# 人脸检测模型配置权重 faceProto model/opencv_face_detector.pbtxt faceModel model/opencv_face_detector_uint8.pb # 年龄预测模型 ageProto model/deploy_age.prototxt ageModel age_net.caffemodel # 性别预测模型 genderProto model/deploy_gender.prototxt genderModel gender_net.caffemodel关键说明这些都是别人训练好的深度学习模型你直接用就行必须把这些模型文件放在model/文件夹下否则代码报错模型结构.prototxt 网络结构 /.caffemodel/.pb 训练好的权重ageNet cv2.dnn.readNet(ageModel, ageProto) # 年龄模型 genderNet cv2.dnn.readNet(genderModel, genderProto) # 性别模型 faceNet cv2.dnn.readNet(faceModel, faceProto) # 人脸检测模型作用把模型文件读入内存准备好进行推理预测。# 模型输出的8个年龄段 ageList [(0-2), (4-6), (8-12), (15-20), (25-32), (38-43), (48-53), (60-100)] genderList [男性, 女性] # 性别输出标签 mean (78.426, 87.768, 114.895) # 图像预处理减均值模型要求模型输出是概率数组通过索引对应上面的文字mean是模型训练时的图像均值必须固定不能改def getBoxes(net, frame): # 获取画面宽高 frameHeight frame.shape[0] frameWidth frame.shape[1] # 图像预处理 → 变成模型能识别的格式 blob blob cv2.dnn.blobFromImage(frame, 1.0, (300, 300), (104, 117, 123), swapRBTrue) net.setInput(blob) # 把图片送入模型 detections net.forward() # 模型推理输出所有人脸检测结果 faceBoxes [] for i in range(detections.shape[2]): confidence detections[0,0,i,2] # 置信度模型认为这是不是人脸 if confidence 0.7: # 置信度0.7才保留过滤误检测 # 计算人脸在画面中的坐标 x1 int(detections[0,0,i,3] * frameWidth) y1 int(detections[0,0,i,4] * frameHeight) x2 int(detections[0,0,i,5] * frameWidth) y2 int(detections[0,0,i,6] * frameHeight) faceBoxes.append([x1,y1,x2,y2]) # 绘制绿色人脸框 cv2.rectangle(frame, (x1,y1), (x2,y2), (0,255,0), 2) return frame, faceBoxes核心原理blob把图像转换成神经网络能识别的格式detections模型输出的所有人脸位置 置信度confidence 0.7只保留模型认为可信度高的人脸返回值画好框的图片所有人脸的坐标列表faceBoxesdef cv2AddChineseText(img, text, position, textColor(0,255,0), textSize30): # OpenCV 转 PIL 格式 img Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) draw ImageDraw.Draw(img) # 使用系统宋体 fontStyle ImageFont.truetype(simsun.ttc, textSize) draw.text(position, text, textColor, fontfontStyle) # 转回 OpenCV 格式 return cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)原生 OpenCV 不支持中文会乱码必须用 PIL 库中转处理。while True: ret, frame cap.read() # 读取一帧画面 if not ret: break # 读取失败则退出 frame cv2.flip(frame, 1) # 镜像翻转画面更符合人眼习惯 # 调用人脸检测函数 → 返回画好框的图像 所有人脸坐标 frame, faceBoxes getBoxes(faceNet, frame) if not faceBoxes: print(当前镜头中没有人) cv2.imshow(result, frame) if cv2.waitKey(1) 27: break continue # 没有人脸跳过后续处理 # 遍历检测到的每一张人脸 for faceBox in faceBoxes: x1,y1,x2,y2 faceBox face frame[y1:y2, x1:x2] # 从画面中截取出人脸区域 # 把人脸转为模型输入格式 blob cv2.dnn.blobFromImage(face, 1.0, (227,227), mean, swapRBFalse) # 预测性别 genderNet.setInput(blob) genderPred genderNet.forward() # 输出[男性概率,女性概率] gender genderList[genderPred[0].argmax()] # 取概率最大的 # 预测年龄 ageNet.setInput(blob) agePred ageNet.forward() age ageList[agePred[0].argmax()] # 标注结果 result f{gender},{age} frame cv2AddChineseText(frame, result, (x1, y1-30), (0,255,0), 30) cv2.imshow(result, frame) # 显示最终画面 if cv2.waitKey(1) 27: # 按 ESC 退出 break关键逻辑face frame[y1:y2, x1:x2]从大图里只抠出人脸送给年龄性别模型genderNet.forward()模型输出两个概率[男性概率, 女性概率]argmax()取出概率最大的那个ageNet.forward()输出 8 个概率对应 8 个年龄段cv2AddChineseText在人脸框上方显示男性,(25-32)七、总结7.1 项目总结本文基于 dlib 和 OpenCV实现了两个经典的人脸应用疲劳检测基于眼睛纵横比 EAR通过 dlib 关键点定位实现实时监测年龄性别识别基于预训练 CNN 模型通过 OpenCV DNN 模块实现实时识别

相关文章:

基于dlib+OpenCV的人脸疲劳检测 + 年龄性别识别实战

一、前言在计算机视觉领域,人脸相关技术一直是热门方向,从人脸检测、关键点定位到疲劳检测、年龄性别识别,都有着广泛的应用场景,比如驾驶员疲劳监测、智能门禁、人机交互等。本文将基于dlib和OpenCV,从零实现两个经典…...

OpenClaw对话日志分析:千问3.5-35B-A3B-FP8任务执行效率提升技巧

OpenClaw对话日志分析:千问3.5-35B-A3B-FP8任务执行效率提升技巧 1. 从8分钟到3分钟的优化之旅 上个月,当我第一次用OpenClaw对接千问3.5-35B-A3B-FP8模型执行自动化任务时,一个简单的"资料收集摘要生成"流程平均需要8分钟才能完…...

基于S7-200 PLC和组态王矿井通风控制

基于S7-200 PLC和组态王矿井通风控制矿井通风系统的自动化控制对安全生产太重要了。老张上次下井巡检时说:"现在这通风系统比二十年前强多了,以前手动调风门得拿命赌操作工的手速。"今天咱们就聊聊怎么用S7-200 PLC和组态王搞矿井通风控制&…...

RAG大模型“外挂“揭秘:3步解锁私有数据问答,秒变“开卷学霸“!

什么是 RAG?一文搞懂大模型时代最火技术 🎯 当AI遇到"失忆症":RAG来拯救 相信用过 ChatGPT 的朋友都遇到过这种尴尬: 你问它最新新闻,它回答"我的知识截止到2023年"你问公司内部政策,它…...

ai辅助开发:让快马智能生成win11安装openclaw的交互式诊断助手

最近在折腾Win11系统上安装OpenClaw这个工具时,发现手动安装过程特别容易踩坑。从依赖版本冲突到权限问题,稍不注意就会卡住。后来尝试用InsCode(快马)平台的AI辅助功能,意外发现它能生成一个智能安装助手,把整个流程变得特别顺畅…...

如何在 Laravel Eloquent 中准确检测两个日期时间范围是否重叠

本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现,纠正常见边界条件误判问题,提供简洁可靠的数据库查询方案及完整代码示例。 本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现,纠正常见边界条件误判问题&…...

Docker TLS 证书一键生成脚本(安全加密远程访问)

Docker TLS 证书一键生成脚本(安全加密远程访问) 这是一键自动生成 Docker TLS 加密证书的 Shell 脚本,无需手动输入复杂命令,自动生成 CA 证书、服务端证书、客户端证书,配置好权限,直接复制就能用&#x…...

ESXi 8.0U3I 硬盘直通(PCIe/RDM)完全解决方案:从原理、配置到故障排错全攻略

在 ESXi 8.0U3I 环境中,硬盘直通(含 PCIe 控制器直通 与 RDM 裸设备映射)是实现虚拟机直接访问物理硬盘、最大化存储性能与兼容性的核心技术,但 8.0U3I 对消费级硬件、SATA/NVMe 控制器、驱动签名的管控更严格,极易出现无法开启直通、直通后硬…...

2026.4.7总结

工作日精进:这个月在心声上看到许多离职的帖子,估计是有很多拿完年终奖离职的。看到别人写的离职感悟,我多少有些共情。当有一天,我离职的时候,我也要写一篇长篇大论。早上HR跟入职一两年的人解读了esop相关政策。这政…...

VCF 部署不踩坑!ESXi 主机 SSL 指纹怎么拿、怎么用?一文简单了解

在部署 VMware Cloud Foundation(VCF)9.0 时,很多人会卡在 “ESXi 主机指纹验证” 这一步 —— 自动部署时 JSON 文件缺了它会失败,手动确认又怕输错。其实这就是主机的 “安全身份证”,用来验证连接的真实性。本文用通俗的语言解释 SSL 指纹…...

PyTorch3D在Windows上安装总报错?试试这个绕过源码编译的Pip直装方案(适配PyTorch 2.0.1 + CUDA 11.7)

PyTorch3D在Windows上安装总报错?试试这个绕过源码编译的Pip直装方案(适配PyTorch 2.0.1 CUDA 11.7) 如果你是一名在Windows平台上进行3D视觉研究的开发者,想必对PyTorch3D这个强大的3D深度学习库并不陌生。然而,官方…...

MacOS极简部署OpenClaw:5分钟连接Phi-3-vision-128k-instruct模型

MacOS极简部署OpenClaw:5分钟连接Phi-3-vision-128k-instruct模型 1. 为什么选择OpenClawPhi-3组合 去年第一次听说AI能直接操作我的电脑时,我本能地感到不安——让一个云端模型控制本地文件系统?这听起来就像把家门钥匙交给陌生人。直到发…...

STM32堆栈原理与内存管理实践指南

1. 堆栈基础概念解析在嵌入式系统开发中,堆栈(Stack)是最基础也是最重要的内存管理机制之一。简单来说,堆栈就是一块特殊组织方式的内存区域,采用"后进先出"(LIFO)的原则进行数据存取。理解堆栈的工作原理对于STM32开发至关重要&am…...

基于粒子群算法的IEEE33节点配电网无功优化及其结果分析

基于粒子群算法的配电网无功优化 基于IEEE33节点配电网,以无功补偿器的接入位置和容量作为优化变量,以牛拉法进行潮流计算,以配电网网损最小为优化目标,通过优化求解,得到最佳接入位置和容量,优化结果如下所…...

恒压供水系统:维纶通屏与S7 - 200程序的奇妙组合

恒压供水,维纶通屏+s7 200程序在自动化控制领域,恒压供水系统一直是一个经典应用。今天咱就来唠唠如何用维纶通屏搭配S7 - 200程序实现恒压供水。 一、恒压供水原理简介 恒压供水简单来说,就是不管用水量怎么变化,都能…...

OpenAI 把 Codex 接进 Claude Code,这件事比你想的更“工程化”

目录这次到底发生了什么为什么说这是一次“反常识”的动作插件能力拆解:三个命令背后的工程价值Claude Code Codex 的真实工作流长什么样技术实现拆解:它到底怎么接进去的对开发者意味着什么变化一些容易被忽略的坑一、这次到底发生了什么最近一个比较有…...

新手入门指南:基于快马平台构建静电地板施工交互学习系统

作为一名刚接触机房建设的新手,第一次看到"静电地板施工"这个词时,整个人都是懵的。直到我在InsCode(快马)平台上尝试做了一个交互式学习系统,才发现原来掌握这项技能可以这么简单。下面分享下我的学习心得和系统构建过程。 为什么…...

三步生成炫酷3D魔鬼面具:用快马AI快速构建交互式视觉原型

今天想和大家分享一个超实用的技巧——如何用InsCode(快马)平台快速生成3D魔鬼面具的交互式原型。作为一个经常需要做创意展示的设计师,这个工具真的帮我省去了大量开发时间。 从创意到原型的极速转换 以前做3D展示需要先建模再写代码,现在只需要在快马平…...

IceC:面向嵌入式平台的轻量级ICE兼容中间件

1. IceC:面向资源受限嵌入式平台的轻量级ZeroC ICE兼容中间件 1.1 设计定位与工程必要性 IceC并非ZeroC ICE的全功能移植,而是在AVR(如ATmega328P)和ESP8266等典型资源受限平台约束下,对ICE通信模型进行深度裁剪与重构…...

高效跨平台喜马拉雅音频下载器:Go+Qt5技术架构深度解析

高效跨平台喜马拉雅音频下载器:GoQt5技术架构深度解析 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 喜马拉雅FM作为国…...

CSS定位如何实现模态框垂直居中_使用负边距或transform

transform: translate(-50%, -50%) 是最稳的居中方式,配合 position: absolute 或 fixed 及 top: 50%、left: 50%,可无视元素尺寸变化实现精准居中,且兼容滚动与响应式场景。用 transform: translate(-50%, -50%) 是最稳的居中方式绝对定位 …...

mysql如何限制查询结果_mysqllimit语句使用示例

LIMIT 必须放在整个 SELECT 语句的最后,严格位于 ORDER BY 和 GROUP BY 之后、WHERE 之后;写在 WHERE 或 ORDER BY 中间会报错。MySQL 的 LIMIT 用在 WHERE 之后还是 ORDER BY 之后?LIMIT 必须放在整个 SELECT 语句的最后,且严格位…...

解密KV Cache:为什么它能提升大模型推理速度3倍以上?

KV Cache技术深度解析:如何让大模型推理速度飞跃提升? 在自然语言处理领域,大模型推理速度一直是开发者关注的焦点。想象一下,当你向AI助手提问时,如果每次响应都需要等待数秒甚至更久,用户体验将大打折扣。…...

从.nii文件到发表级配图:一份超详细的fMRI脑区(ROI)可视化避坑与调参指南

从.nii文件到发表级配图:一份超详细的fMRI脑区(ROI)可视化避坑与调参指南 当你终于跑完最后一组统计分析,看着屏幕上那些代表显著脑区的彩色斑点时,可能已经迫不及待想把它们放进论文插图。但现实往往是——直接导出的…...

轻量级代码编辑器Lapce从入门到精通:Rust驱动的极速开发体验

轻量级代码编辑器Lapce从入门到精通:Rust驱动的极速开发体验 【免费下载链接】lapce Lightning-fast and Powerful Code Editor written in Rust 项目地址: https://gitcode.com/GitHub_Trending/la/lapce 核心特性解析:为什么选择Rust编写的编辑…...

OpenClaw技能扩展实战:Qwen3.5-9B驱动公众号自动发布

OpenClaw技能扩展实战:Qwen3.5-9B驱动公众号自动发布 1. 为什么选择OpenClaw做公众号自动化 去年开始运营技术公众号时,我每周要花3小时重复做三件事:写Markdown初稿、手动调整公众号排版、上传封面图并提交草稿。直到发现OpenClaw的wechat…...

【Docker】镜像安全扫描工具clair与clairctl

【Docker】镜像安全扫描工具clair与clairctl 镜像扫描结构图 方式2的具体操作步骤 clair是什么? clair是一个开源项目,用于静态分析appc和docker容器中的漏洞。 漏洞元数据从一组已知的源连续导入,并与容器映像的索引内容相关联&#xff0c…...

Linux开发必备:Makefile基础与实战模板解析

1. Linux开发中的Makefile基础在Linux环境下开发程序,与Windows平台最大的区别之一就是编译方式。Windows开发者通常习惯使用集成开发环境(IDE)提供的"一键编译"功能,而Linux开发者则需要掌握Makefile这一强大的构建工具。Makefile本质上是一个…...

菜鸟的逆向工程学习之路——逆向工程基本介绍

菜鸟的逆向工程学习之路——逆向工程基本介绍 菜鸟的逆向工程学习之路——逆向工程基本介绍 逆向工程是一种分析目标系统的过程,旨在识别系统的各组件以及组件间关系,以便能够通过其他形式或在较高的抽象层次上,重建系统的表征。 逆向工程一直…...

嵌入式开发中的串口打印调试与printf重定向

1. 为什么需要串口打印调试?在嵌入式开发中,调试手段的选择往往决定了问题排查的效率。使用仿真器(如J-Link、ST-Link)进行单步调试确实是最直观的方式,但在实际项目中经常会遇到以下限制:硬件限制&#xf…...