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

人脸识别门禁系统技术文档

人脸识别门禁系统技术文档

序言

本文档详细描述了人脸识别门禁系统的技术实现原理与方法。该系统旨在提供高安全性的门禁管理解决方案,通过先进的人脸识别技术,实现无接触式身份验证,提高安全管理效率。

系统整合了人工智能与计算机视觉技术,结合数据库管理系统,实现用户身份的自动识别与验证。相比传统的刷卡、指纹或密码门禁系统,人脸识别门禁系统具有操作便捷、难以伪造、卫生无接触等优势,尤其适合当今对安全性要求高的场所使用。

本项目采用Python作为主要开发语言,集成了多种开源技术框架,包括Flask、OpenCV、dlib、face_recognition等,构建了完整的人脸识别门禁解决方案,支持Web界面和桌面GUI应用两种使用模式。

1. 系统架构

1.1 总体架构

系统采用模块化设计,主要包含以下核心模块:

  1. 前端界面层

    • Web界面:基于Flask框架,提供用户管理、记录查询等功能
    • GUI界面:基于PyQt5开发,提供实时监控和管理功能
  2. 应用逻辑层

    • 用户管理模块:处理用户注册、信息管理等功能
    • 人脸识别模块:负责人脸检测、特征提取和身份识别
    • 门禁控制模块:根据识别结果控制门禁开关
    • 报警模块:处理未授权访问和异常情况
  3. 数据持久层

    • 数据库:使用SQLite存储用户信息、门禁记录和报警记录
    • 文件存储:保存用户人脸图像和未识别人脸记录

1.2 技术栈

  • 后端框架:Python + Flask
  • 前端技术:HTML/CSS/JavaScript + Bootstrap
  • GUI框架:PyQt5
  • 数据库:SQLite + SQLAlchemy ORM
  • 人脸识别:OpenCV + dlib + face_recognition
  • 并发处理:多线程

1.3 模块间关系

+----------------+      +----------------+      +-----------------+
|  用户界面层     | <--> |  应用逻辑层    | <--> |  数据持久层     |
| (Web/GUI界面)  |      | (业务逻辑处理)  |      | (数据库/文件)   |
+----------------+      +----------------+      +-----------------+^                       ^                       ^|                       |                       |v                       v                       v
+----------------+      +----------------+      +-----------------+
|  用户交互模块   |      |  人脸识别模块  |      |  数据库模型     |
| (routes/GUI)   |      | (face_utils)   |      | (models)        |
+----------------+      +----------------+      +-----------------+

2. 人脸识别原理与实现

2.1 人脸识别流程

系统的人脸识别流程包含以下主要步骤:

  1. 人脸检测:从摄像头捕获的图像中检测人脸区域
  2. 活体检测:确认检测到的是真实人脸而非照片或视频
  3. 特征提取:提取人脸的关键特征点和生成特征向量
  4. 身份匹配:将提取的特征与数据库中已存储的特征进行比对
  5. 身份确认:根据比对结果确认身份,决定是否授权通行

2.2 人脸检测实现

系统使用dlib的HOG (Histogram of Oriented Gradients) 人脸检测器实现人脸检测功能:

def detect_faces(frame):"""检测图像中的人脸位置"""# 将图像从BGR转换为RGB格式rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 使用HOG人脸检测器进行检测face_locations = face_recognition.face_locations(rgb_frame, model="hog")return face_locations

HOG人脸检测算法工作原理:

  1. 计算图像梯度的方向和大小
  2. 将图像分成小单元格,每个单元格生成梯度方向直方图
  3. 将单元格组合成更大的块,并进行局部对比度归一化
  4. 使用训练好的SVM分类器检测人脸

2.3 活体检测实现

为防止照片攻击,系统实现了基于纹理分析的活体检测功能:

def verify_face_liveness(frame, face_location):"""验证人脸是否是真实的(活体检测)"""# 从人脸位置提取人脸区域top, right, bottom, left = face_locationface_image = frame[top:bottom, left:right]# 转换为灰度图gray = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY)# 使用局部二值模式(LBP)特征提取纹理信息# 实际实现中会使用更复杂的算法# 分析图像纹理特征,判断是否为真实人脸# ... 实际计算过程略 ...return is_real, confidence

活体检测的核心思想:

  1. 分析人脸图像的纹理特征,真实人脸具有自然的纹理变化
  2. 检测人脸的微表情和眨眼动作
  3. 分析深度信息,平面照片缺乏自然的深度变化

2.4 人脸特征提取

系统使用dlib的人脸特征点检测和face_recognition库实现特征提取:

def extract_facial_features(image, face_location):"""提取更详细的人脸特征"""if landmark_predictor is None:return None# 将face_location格式转换为dlib格式top, right, bottom, left = face_locationdlib_rect = dlib.rectangle(left, top, right, bottom)# 获取人脸关键点landmarks = landmark_predictor(image, dlib_rect)# 提取眼睛、鼻子、嘴等特征的位置信息features = {}# 眼睛间距left_eye_x = (landmarks.part(36).x + landmarks.part(39).x) / 2left_eye_y = (landmarks.part(36).y + landmarks.part(39).y) / 2right_eye_x = (landmarks.part(42).x + landmarks.part(45).x) / 2right_eye_y = (landmarks.part(42).y + landmarks.part(45).y) / 2features['eye_distance'] = np.sqrt((right_eye_x - left_eye_x)**2 + (right_eye_y - left_eye_y)**2)# 眼睛与嘴巴的比例mouth_x = (landmarks.part(48).x + landmarks.part(54).x) / 2mouth_y = (landmarks.part(48).y + landmarks.part(54).y) / 2eyes_center_x = (left_eye_x + right_eye_x) / 2eyes_center_y = (left_eye_y + right_eye_y) / 2features['eye_mouth_ratio'] = np.sqrt((mouth_x - eyes_center_x)**2 + (mouth_y - eyes_center_y)**2) / features['eye_distance']# 脸部宽高比face_width = right - leftface_height = bottom - topfeatures['face_ratio'] = face_width / face_heightreturn features

特征提取过程:

  1. 检测68个人脸关键点(眼睛、鼻子、嘴唇等)
  2. 计算关键点间的几何关系和比例
  3. 使用深度学习模型生成128维人脸编码向量

2.5 身份匹配算法

系统使用欧氏距离进行人脸特征比对和身份匹配:

def recognize_face(face_encoding, known_face_encodings, tolerance=0.5):"""识别人脸"""if not known_face_encodings:return None, 1.0# 提取用户ID和编码user_ids = [uid for uid, _ in known_face_encodings]encoding_data = [data for _, data in known_face_encodings]# 计算与已知人脸的距离face_distances = []for data in encoding_data:if isinstance(data, dict) and 'encoding' in data:# 新格式:字典包含编码和特征encoding = data['encoding']distance = face_recognition.face_distance([encoding], face_encoding)[0]# 如果有额外特征,增加其权重if data.get('features') is not None:distance *= 0.95face_distances.append(distance)else:# 旧格式:直接是编码distance = face_recognition.face_distance([data], face_encoding)[0]face_distances.append(distance)# 找到最小距离if face_distances:min_distance_idx = np.argmin(face_distances)min_distance = face_distances[min_distance_idx]# 确保是numpy类型,避免可能的类型错误if isinstance(min_distance, np.ndarray):min_distance = float(min_distance)# 如果最小距离小于容差,返回匹配的用户IDif min_distance <= tolerance:return user_ids[min_distance_idx], min_distancereturn None, 1.0 if not face_distances else min_distance

身份匹配原理:

  1. 计算待识别人脸编码与数据库中所有人脸编码的欧氏距离
  2. 找出距离最小的人脸编码对应的用户
  3. 如果最小距离小于预设阈值(tolerance),认为匹配成功
  4. 阈值越小,要求越严格,错误接受率降低但错误拒绝率可能增加

3. 数据库设计与实现

3.1 数据库模型

系统使用SQLAlchemy ORM框架实现数据库操作,主要包含以下数据模型:

3.1.1 用户模型(User)
class User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(100), unique=True, nullable=False)name = db.Column(db.String(100), nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)password = db.Column(db.String(200), nullable=False)face_encoding = db.Column(db.PickleType, nullable=True)  # 人脸编码image_file = db.Column(db.String(100), nullable=True, default='default.jpg')  # 人脸图像文件register_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)role = db.Column(db.String(20), nullable=False, default='user')  # 用户角色:admin或user# 一对多关系:一个用户可以有多个门禁记录access_records = db.relationship('AccessRecord', backref='user', lazy=True)
3.1.2 门禁记录模型(AccessRecord)
class AccessRecord(db.Model):__tablename__ = 'access_records'id = db.Column(db.Integer, primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)access_type = db.Column(db.String(10), nullable=False)  # 'entry' 或 'exit'status = db.Column(db.String(20), nullable=False)  # 'authorized' 或 'unauthorized'
3.1.3 报警记录模型(Alert)
class Alert(db.Model):__tablename__ = 'alerts'id = db.Column(db.Integer, primary_key=True)timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)alert_type = db.Column(db.String(50), nullable=False)  # 报警类型description = db.Column(db.Text, nullable=True)  # 报警描述image_file = db.Column(db.String(100), nullable=True)  # 报警时捕获的图像processed = db.Column(db.Boolean, default=False)  # 报警是否已处理

3.2 数据库操作实现

系统封装了一系列数据库操作函数,提供统一的接口:

# 用户管理
def get_user_by_id(user_id):"""根据用户ID获取用户"""return User.query.get(user_id)def create_user(username, name, email, password, role='user', face_encoding=None, image_file=None):"""创建新用户"""user = User(username=username,name=name,email=email,password=password,role=role,face_encoding=face_encoding,image_file=image_file)db.session.add(user)db.session.commit()return user# 门禁记录管理
def record_access(user_id, access_type='entry', status='authorized'):"""记录门禁访问"""record = AccessRecord(user_id=user_id,access_type=access_type,status=status)db.session.add(record)db.session.commit()return record# 报警管理
def create_alert(alert_type, description=None, image_file=None):"""创建报警记录"""alert = Alert(alert_type=alert_type,description=description,image_file=image_file,processed=False)db.session.add(alert)db.session.commit()return alert

4. 摄像头模块实现

4.1 Web应用摄像头实现

Web应用使用Flask与OpenCV结合,实现实时视频流处理:

class Camera:"""相机类,用于处理视频流"""def __init__(self, camera_id=0):"""初始化相机"""self.camera_id = camera_idself.is_running = Falseself.thread = Noneself.frame = Noneself.processed_frame = Noneself.last_access = 0self.known_face_encodings = []self.recognized_users = {}  # 最近识别的用户 {user_id: (timestamp, name)}self.access_animations = {}  # 访问动画 {user_id: (timestamp, face_location, access_granted)}def start(self):"""启动相机线程"""if self.thread is None:self.is_running = Trueself.thread = threading.Thread(target=self._capture_loop)self.thread.daemon = Trueself.thread.start()def _capture_loop(self):"""捕获视频帧的循环"""# 初始化相机camera = cv2.VideoCapture(self.camera_id)# 加载已知人脸编码self._load_known_faces()# 处理帧的间隔(秒)process_interval = 0.5  # 每0.5秒处理一次last_process_time = 0while self.is_running:# 捕获一帧success, frame = camera.read()# 保存原始帧self.frame = frame# 定期处理帧(降低CPU使用率)current_time = time.time()if current_time - last_process_time >= process_interval:# 处理帧self._process_frame(frame)last_process_time = current_time# 生成MJPEG流供前端显示# ...

4.2 GUI应用摄像头实现

GUI应用使用PyQt5与OpenCV结合,实现实时视频处理:

class VideoThread(QThread):"""视频处理线程"""change_pixmap_signal = pyqtSignal(QImage)face_detected_signal = pyqtSignal(list, list, list)  # 人脸位置、姓名、状态access_granted_signal = pyqtSignal(str, float)  # 用户名、匹配度access_denied_signal = pyqtSignal(str, float)   # 拒绝原因、匹配度def run(self):"""线程主函数"""# 初始化相机cap = cv2.VideoCapture(self.camera_id)# 加载已知人脸编码self._load_known_faces()while self.running:ret, frame = cap.read()# 处理帧,识别人脸current_time = time.time()if current_time - last_process_time >= self.process_interval:self._process_frame(frame)last_process_time = current_time# 转换帧格式并发送信号rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)h, w, ch = rgb_frame.shapebytes_per_line = ch * wq_img = QImage(rgb_frame.data, w, h, bytes_per_line, QImage.Format_RGB888)self.change_pixmap_signal.emit(q_img)

4.3 实时视频处理优化

系统采用以下策略优化实时视频处理性能:

  1. 间隔处理:不处理每一帧,而是每隔一段时间(如0.5秒)处理一次,减少CPU使用率
  2. 多线程处理:将视频捕获和处理放在单独的线程中,避免阻塞主UI线程
  3. 降低分辨率:设置适当的视频捕获分辨率,平衡识别效果和处理速度
  4. 识别频率控制:对同一用户的重复识别设置时间间隔(如5秒),避免重复处理和记录

5. Web应用实现

5.1 Flask应用结构

系统使用Flask的Blueprint功能组织不同模块的路由:

# 创建Blueprint
main = Blueprint('main', __name__)  # 主页模块
auth = Blueprint('auth', __name__)  # 认证模块
user = Blueprint('user', __name__)  # 用户模块
admin = Blueprint('admin', __name__)  # 管理员模块
api = Blueprint('api', __name__)    # API接口
camera_bp = Blueprint('camera_bp', __name__)  # 摄像头模块# 在应用初始化时注册Blueprint
def init_routes(app):app.register_blueprint(main)app.register_blueprint(auth, url_prefix='/auth')app.register_blueprint(user, url_prefix='/user')app.register_blueprint(admin, url_prefix='/admin')app.register_blueprint(api, url_prefix='/api')app.register_blueprint(camera_bp, url_prefix='/camera')

5.2 用户认证实现

系统实现了基于Session的用户认证机制:

@auth.route('/login', methods=['GET', 'POST'])
def login():"""登录"""if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')user = get_user_by_username(username)if user and check_password_hash(user.password, password):session['user_id'] = user.idsession['user_role'] = user.rolenext_page = request.args.get('next')if next_page:return redirect(next_page)elif user.role == 'admin':return redirect(url_for('admin.dashboard'))else:return redirect(url_for('main.index'))flash('登录失败,请检查用户名和密码。', 'danger')return render_template('auth/login.html')

5.3 访问控制实现

系统使用装饰器实现路由的访问控制:

def admin_required(f):"""检查用户是否具有管理员权限的装饰器"""def decorated_function(*args, **kwargs):if 'user_id' not in session or session.get('user_role') != 'admin':flash('您没有权限访问此页面。', 'danger')return redirect(url_for('main.index'))return f(*args, **kwargs)decorated_function.__name__ = f.__name__return decorated_functiondef login_required(f):"""检查用户是否已登录的装饰器"""def decorated_function(*args, **kwargs):if 'user_id' not in session:flash('请先登录。', 'danger')return redirect(url_for('auth.login', next=request.url))return f(*args, **kwargs)decorated_function.__name__ = f.__name__return decorated_function

5.4 视频流实现

系统使用生成器函数和MJPEG流实现实时视频传输:

@camera_bp.route('/live-stream')
def live_stream():"""实时视频流"""return Response(generate(),mimetype='multipart/x-mixed-replace; boundary=frame')def generate():"""生成MJPEG视频流"""camera = get_camera()camera.start()while True:frame = camera.get_frame()if frame is None:continue# 将帧编码为JPEG格式_, jpeg = cv2.imencode('.jpg', frame)# 以多部分响应格式返回yield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n')

6. GUI应用实现

6.1 PyQt5应用结构

系统使用PyQt5实现了独立的桌面GUI应用:

class MainWindow(QMainWindow):"""主窗口类"""def __init__(self):super().__init__()self.setWindowTitle('人脸识别门禁系统')self.setMinimumSize(800, 600)# 初始化视频线程self.video_thread = VideoThread()self.video_thread.change_pixmap_signal.connect(self.update_image)self.video_thread.face_detected_signal.connect(self.update_face_info)self.video_thread.access_granted_signal.connect(self.on_access_granted)self.video_thread.access_denied_signal.connect(self.on_access_denied)# 初始化UIself.init_ui()# 启动视频线程self.video_thread.start()def init_ui(self):"""初始化用户界面"""# 主布局main_layout = QVBoxLayout()# 创建选项卡self.tabs = QTabWidget()# 添加各功能选项卡self.create_monitor_tab()  # 监控选项卡self.create_user_tab()     # 用户管理选项卡self.create_records_tab()  # 记录查询选项卡self.create_alerts_tab()   # 报警管理选项卡self.create_settings_tab() # 系统设置选项卡# 将选项卡添加到主布局main_layout.addWidget(self.tabs)# 设置中心部件central_widget = QWidget()central_widget.setLayout(main_layout)self.setCentralWidget(central_widget)

6.2 实时视频显示

GUI应用使用信号和槽机制处理视频显示:

@pyqtSlot(QImage)
def update_image(self, image):"""更新图像显示"""self.video_label.setPixmap(QPixmap.fromImage(image))@pyqtSlot(list, list, list)
def update_face_info(self, face_locations, face_names, face_status):"""更新人脸信息显示"""self.face_list.clear()for name, status in zip(face_names, face_status):item = QListWidgetItem(f"{name} - {'已授权' if status == 'authorized' else '未授权'}")if status == 'authorized':item.setForeground(Qt.green)else:item.setForeground(Qt.red)self.face_list.addItem(item)

6.3 用户管理界面

GUI应用实现了完整的用户管理功能:

def create_user_tab(self):"""创建用户管理选项卡"""user_tab = QWidget()layout = QHBoxLayout()# 用户列表self.user_list = QListWidget()self.refresh_users()  # 刷新用户列表# 操作按钮buttons_layout = QVBoxLayout()add_btn = QPushButton('添加用户')add_btn.clicked.connect(self.add_user)edit_btn = QPushButton('编辑用户')edit_btn.clicked.connect(self.edit_user)delete_btn = QPushButton('删除用户')delete_btn.clicked.connect(self.delete_user)buttons_layout.addWidget(add_btn)buttons_layout.addWidget(edit_btn)buttons_layout.addWidget(delete_btn)buttons_layout.addStretch()# 添加到布局layout.addWidget(self.user_list)layout.addLayout(buttons_layout)user_tab.setLayout(layout)self.tabs.addTab(user_tab, '用户管理')

7. 安全特性实现

7.1 密码安全

系统使用Werkzeug的安全哈希算法实现密码加密存储:

from werkzeug.security import generate_password_hash, check_password_hash# 密码加密
hashed_password = generate_password_hash(password)# 密码验证
if check_password_hash(user.password, password):# 密码正确,允许登录

7.2 活体检测安全

系统实现了多层活体检测策略防止照片欺骗:

  1. 纹理分析:分析人脸图像的纹理特征,真实人脸与照片有明显区别
  2. 眨眼检测:监测眼部区域的变化,检测自然眨眼动作
  3. 深度分析:通过提取不同区域的特征,分析人脸的自然立体特性
def verify_face_liveness(frame, face_location):"""验证人脸是否是真实的(活体检测)"""# ... 实现代码 ...# 使用多种策略判断活体liveness_score = 0.0# 策略1: 图像纹理分析texture_score = analyze_texture(face_region)liveness_score += texture_score * 0.4  # 权重0.4# 策略2: 眨眼检测blink_score = detect_blink(face_region, landmarks)liveness_score += blink_score * 0.3  # 权重0.3# 策略3: 深度分析depth_score = analyze_depth(face_region)liveness_score += depth_score * 0.3  # 权重0.3# 判断是否为真实人脸is_real = liveness_score >= 0.75  # 阈值0.75return is_real, liveness_score

7.3 入侵检测与报警

系统实现了自动入侵检测和报警功能:

# 创建报警记录
alert_type = "未授权访问"
description = f"检测到未授权的人脸访问,时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
create_alert(alert_type, description, image_filename)# 触发报警通知
trigger_alarm(alert_type, description)

报警通知功能使用邮件发送:

def send_alert_email(recipient, subject, body):"""发送报警邮件"""msg = MIMEMultipart()msg['From'] = SMTP_USERmsg['To'] = recipientmsg['Subject'] = subject# 添加正文msg.attach(MIMEText(body, 'plain'))# 发送邮件try:server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)server.starttls()server.login(SMTP_USER, SMTP_PASSWORD)server.send_message(msg)server.quit()return Trueexcept Exception as e:print(f"邮件发送失败: {e}")return False

8. 系统性能与优化

8.1 性能优化策略

系统实现了多种优化策略以提高性能:

  1. 多线程处理:使用独立线程处理视频捕获和人脸识别,避免阻塞主线程
  2. 间隔处理:不处理每一帧,而是每隔一段时间(如0.5秒)处理一次
  3. 模型选择:使用HOG人脸检测器而非更慢的CNN模型,在保持准确率的同时提高处理速度
  4. 图像缩放:将输入图像缩小到合适尺寸再进行处理,提高检测速度
  5. 缓存机制:缓存已知人脸编码,避免重复计算

8.2 资源占用优化

针对CPU和内存占用优化的措施:

  1. 按需加载:只在需要时加载人脸识别模型
  2. 定时关闭:长时间无活动自动关闭摄像头
  3. 批量处理:将多个操作合并批量处理
  4. 内存管理:及时释放不再使用的资源
# 长时间无活动自动关闭摄像头
if current_time - self.last_access > 600:  # 10分钟无活动self.stop()break

9. 部署与维护

9.1 系统部署

系统支持多种部署方式:

  1. 本地部署:在本地计算机上运行,适用于小型办公室或家庭
  2. 服务器部署:在服务器上部署Web应用,通过网络访问
  3. 边缘设备部署:在专用的门禁控制设备上部署,如树莓派

部署流程:

1. 安装依赖包:pip install -r requirements.txt
2. 下载模型文件:python download_models.py
3. 初始化数据库:python init_db.py
4. 运行应用:- Web应用:python run.py- GUI应用:python run_gui.py

9.2 系统维护

系统提供了便捷的维护功能:

  1. 用户管理:添加、编辑和删除用户
  2. 记录管理:查询和导出门禁记录
  3. 报警处理:查看和处理报警记录
  4. 系统设置:调整系统参数,如识别阈值、报警配置等

10. 总结与展望

10.1. 系统特点总结

本人脸识别门禁系统具有以下特点:

  1. 高安全性:结合人脸识别与活体检测,有效防止伪造欺骗
  2. 易用性:提供Web和GUI两种界面,满足不同用户需求
  3. 灵活性:模块化设计,便于扩展和定制
  4. 实时性:优化的视频处理流程,确保实时响应
  5. 可靠性:完善的异常处理和报警机制,保障系统稳定运行

10.2. 未来发展方向

系统可以从以下方面进一步发展和完善:

  1. 多模态融合:结合人脸识别与其他生物识别技术(如指纹、虹膜)提高安全性
  2. 深度学习优化:采用更先进的深度学习模型提高识别准确率
  3. 分布式部署:支持多门点联网管理,集中控制
  4. 移动端开发:开发移动应用,实现远程监控和管理
  5. 智能分析:加入人流统计、异常行为检测等智能分析功能

综上所述,本人脸识别门禁系统通过整合人工智能与计算机视觉技术,为门禁管理提供了安全、高效的解决方案。系统的模块化设计和优化策略,确保了良好的性能和用户体验,为智能安防领域提供了新的选择。

相关文章:

人脸识别门禁系统技术文档

人脸识别门禁系统技术文档 序言 本文档详细描述了人脸识别门禁系统的技术实现原理与方法。该系统旨在提供高安全性的门禁管理解决方案&#xff0c;通过先进的人脸识别技术&#xff0c;实现无接触式身份验证&#xff0c;提高安全管理效率。 系统整合了人工智能与计算机视觉技…...

SAP 交货单行项目含税金额计算报cx_sy_zerodivide处理

业务背景&#xff1a;SAP交货单只有数量&#xff0c;没有金额&#xff0c;所以开发报表从订单的价格按数量计算交货单的金额。 用户反馈近期报表出现异常&#xff1a; ****2012/12/12 清风雅雨 规格变更 Chg 修改开始 ** 修改原因:由于余数为0时&#xff0c;可能会报错溢出。…...

【Qt】之音视频编程1:QtAV的背景和安装篇

QtAV 背景与核心概念 1. 什么是 QtAV&#xff1f; QtAV 是一个基于 Qt 框架 和 FFmpeg 的多媒体播放库&#xff0c;旨在为 Qt 应用程序提供高性能、跨平台的音视频播放、处理及渲染功能。它封装了 FFmpeg 的底层编解码能力&#xff0c;并通过 Qt 的图形系统&#xff08;如 QM…...

算法与数据结构 - 二叉树结构入门

目录 1. 普通二叉树结构 1.1. 常见术语 1.2. 完全二叉树 (Complete Binary Tree) 1.3. 满二叉树 (Full Binary Tree) 2. 特殊二叉树结构 2.1. 二叉搜索树 (BST) 2.1.1. BST 基本操作 - 查找 2.1.2. BST 基本操作 - 插入 2.1.3. BST 基本操作 - 删除 2.2. 平衡二叉树…...

如何使用远程桌面控制电脑

目的&#xff1a; 通过路由器使用pc控制台式机&#xff0c;实现了有线/无线pc与台式机的双向远程桌面控制 最核心就两条&#xff1a;get ip地址与被控制机器的账户与密码。 现象挺神奇&#xff1a;被控制电脑的电脑桌面处于休眠模式&#xff0c;此时强行唤醒被控电脑会导致中断…...

SpringMVC-执行流程

目录 前言 一、SpringMVC执行流程 SpringMVC 主要组件 SpringMVC 的执行流程 简要分析执行流程 总结 前言 理解SpringMVC的执行流程是学习SpringMVC工作原理的重要一步。 项目内容参考&#xff1a;SpringMVC-简介及入门-CSDN博客 一、SpringMVC执行流程 SpringMVC 主要组…...

计算机网络网络层(下)

一、互联的路由选择协议&#xff08;网络层控制层面内容&#xff09; &#xff08;一&#xff09;有关路由选择协议的几个概念 1.理想的路由算法 &#xff08;1&#xff09;理想路由算法应具备的特点&#xff1a;算法必须正确和完整的&#xff0c;算法在计算上应简单&#x…...

深入学习Zookeeper的知识体系

目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…...

主从架构:技术原理与实现

一.简单介绍分布式锁的复习 今天在一个分布式锁的视频讲解中&#xff0c;提到了主从架构&#xff0c;所以有了这篇文章。 当然我们可以先说说分布式锁&#xff0c;可以使用redis的setnxlua脚本实现&#xff0c;或者也可以用redission实现&#xff0c;或者看门狗机制。 由看门…...

大模型核心运行机制

大模型核心运行机制目录 一、核心架构&#xff1a;Transformer的演进与改进1.1 核心组件包括&#xff1a;1.1.1 自注意力机制&#xff08;Self-Attention&#xff09;1.1.2 多头注意力&#xff08;Multi-Head Attention&#xff09;1.1.3 位置编码&#xff08;Positional Encod…...

uniapp跨平台开发HarmonyOS NEXT应用初体验

之前写过使用uniapp开发鸿蒙应用的教程&#xff0c;简单介绍了如何配置开发环境和运行项目。那时候的HbuilderX还是4.22版本&#xff0c;小一年过去了HbuilderX的正式版本已经来到4.64&#xff0c;历经了多个版本的更新后&#xff0c;跨平台开发鸿蒙应用的体验大幅提升。今天再…...

2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)

距离2025上半年“系统架构设计师”考试已经只剩最后两周了&#xff0c;还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习&#xff0c;特此提供一份考前冲刺攻略。本指南包括考情分析、答题技巧、注意事项三个部分&#xff0c;可以参考此指南进行最后的复习要领&a…...

C语言主要标准版本的演进与核心区别的对比分析

以下是C语言主要标准版本的演进与核心区别的对比分析 K&R C&#xff08;1978年&#xff09; 定位‌&#xff1a;非标准化的原始版本&#xff0c;由Brian Kernighan和Dennis Ritchie定义 特性‌&#xff1a; 基础语法&#xff1a;函数声明无参数列表&#xff08;如int func…...

使用 goaccess 分析 nginx 访问日志

介绍 goaccess 是一个在本地解析日志的工具, 可以直接在命令行终端环境中使用 TUI 界面查看分析结果, 也可以导出为更加丰富的 HTML 页面. 官网: https://goaccess.io/ 下载安装 常见的 Linux 包管理器中都包含了 goaccess, 直接安装就行. 以 Ubuntu 为例: sudo apt instal…...

vue3与springboot交互-前后分离【完成登陆验证及页面跳转】

vue3实现与springboot交互【完成登陆及页面跳转】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a…...

【Hot 100】208. 实现 Trie (前缀树)

目录 引言实现 Trie (前缀树)我的解题代码解析代码思路分析优化建议1. 内存泄漏问题2. 使用智能指针优化内存管理3. 输入合法性校验&#xff08;可选&#xff09;4. 其他优化 总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1…...

【2025最新】Vm虚拟机中直接使用Ubuntu 免安装过程直接使用教程与下载

Ubuntu 是一个基于 Debian 的自由开源 Linux 操作系统&#xff0c;面向桌面、服务器和云计算平台广泛应用。 由英国公司 Canonical Ltd. 维护和发布&#xff0c;Ubuntu 强调易用性、安全性和稳定性&#xff0c;适合个人用户、开发者以及企业部署使用。 Ubuntu 默认使用 GNOME …...

思路解析:第一性原理解 SQL

目录 题目描述 &#x1f3af; 应用第一性原理来思考这个 SQL 题目 ✅ 第一步&#xff1a;还原每个事件的本质单位 ✅ 第二步&#xff1a;如果一个表只有事件&#xff0c;如何构造事件对&#xff1f; ✅ 第三步&#xff1a;加过滤条件&#xff0c;只保留“同一机器、同一进…...

相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之七:高通Camx HAL架构opencamera二级日志详解及关键字 这一篇我们开始讲: 相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字 目录 【关注我,后续持续…...

Vue2 elementUI 二次封装命令式表单弹框组件

需求&#xff1a;封装一个表单弹框组件&#xff0c;弹框和表单是两个组件&#xff0c;表单组件以插槽的形式动态传入弹框组件中。 外部组件使用的方式如下&#xff1a; 直接上代码&#xff1a; MyDialog.vue 弹框组件 <template><el-dialog:titletitle:visible.syn…...

Docker入门教程:常用命令与基础概念

目录 简介常用命令Docker 常用命令汇总docker run 命令格式与参数解析 简介 Docker 是一个客户端-服务器&#xff08;client-server&#xff09;架构的应用程序&#xff0c;其中包含两个主要组件&#xff1a;Docker 客户端和 Docker 守护进程&#xff08;也称为 Docker Daemon…...

Antd中Form详解:

1.获取Form表单值的方式: ① 使用Form.useForm()钩子&#xff08;推荐方式&#xff09; const [form] Form.useForm();const getFormValues () > {const values form.getFieldsValue();};<Form form{form}>...<Form.Item label{null}><Button onClick{ge…...

探索C语言中的二叉树:原理、实现与应用

一、引言 二叉树作为一种重要的数据结构&#xff0c;在计算机科学领域有着广泛的应用&#xff0c;无论是在操作系统的文件系统管理&#xff0c;还是在数据库的索引构建中&#xff0c;都能看到它的身影。在C语言中&#xff0c;我们可以利用指针灵活地构建和操作二叉树。接下来&…...

docker系列-DockerDesktop报错信息(Windows Hypervisor is not present)

Docker Desktop 报错信息 Docker Desktop - Windows Hypervisor is not present Docker Desktop is unable to detect a Hypervisor. Hardware assisted virtualization and data execution protection must be enabled in the BIOS.这是因为 Docker Desktop 需要启用 虚拟化技…...

03.Python 字符串中的空白字符处理

Python 字符串中的空白字符处理 什么是空白字符&#xff1f; 在处理字符串时&#xff0c;常常需要去除多余的空白字符。空白字符包括&#xff1a; 空格&#xff08; &#xff09;制表符&#xff08;\t&#xff09;换行符&#xff08;\n&#xff09;回车符&#xff08;\r&#x…...

《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》

手把手教你用 Kubernetes 部署高可用 WordPress 博客 本实验通过 Kubernetes 容器编排平台&#xff0c;完整部署了一个高可用的 WordPress 网站架构&#xff0c;包含 MariaDB 数据库、WordPress 应用和 Nginx 反向代理三大核心组件。实验涵盖了从基础环境准备到最终服务暴露的…...

Ubuntu源码版comfyui的安装

Comfyui也出桌面版了&#xff0c;但是想让大家多个人都使用怎么办呢&#xff1f;也有方法&#xff0c;安装Linux版&#xff0c;启动后会生成个网页地址&#xff0c;打开就能用了。 1、先来看下本地安装环境配置&#xff1a; 系统&#xff1a;Ubuntu 22.04 内存&#xff1a;2…...

多模态RAG与LlamaIndex——1.deepresearch调研

摘要 关键点&#xff1a; 多模态RAG技术通过结合文本、图像、表格和视频等多种数据类型&#xff0c;扩展了传统RAG&#xff08;检索增强生成&#xff09;的功能。LlamaIndex是一个开源框架&#xff0c;支持多模态RAG&#xff0c;提供处理文本和图像的模型、嵌入和索引功能。研…...

C++ 命令模式详解

命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为对象&#xff0c;从而使你可以参数化客户端使用不同的请求、队列或日志请求&#xff0c;以及支持可撤销的操作。 核心概念 设计原则 命令模式遵循以下设计原则&#xff1a; 单…...

制作一款打飞机游戏47:跳转

编辑器的问题 我们开始为不同的敌人编写一些行为&#xff0c;到目前为止进展顺利&#xff0c;一切都很棒。但上次我们遇到了一些问题&#xff0c;我们发现在这个编辑器中编写代码有时有点困难&#xff0c;因为当你想要在某行之间插入内容时&#xff0c;你不得不删除一切然后重…...