OpenCV HighGUI 模块使用指南(Python 版)
用户让我编写一个 HighGUI 模块的使用指南,包括函数的使用和应用场景的实现。首先,我需要回顾 HighGUI 模块的主要功能:图像显示、视频捕获、鼠标和键盘事件。然后,按照用户提供的结构,整理每个部分的函数详解、代码示例和应用场景。
首先,图像显示部分,需要介绍 imshow、waitKey、destroyAllWindows。要给出基本用法,比如显示图像,处理按键事件。然后是视频捕获,VideoCapture 和 VideoWriter 的使用,包括打开摄像头、读取帧、保存视频。接下来是鼠标和键盘事件,setMouseCallback 的用法,处理点击、拖拽等事件。
应用场景方面,需要具体的例子,比如图像标注工具、实时视频处理、交互式绘图。每个场景要有完整的代码示例,注释清晰。还要考虑最佳实践,比如资源释放、异常处理、性能优化。
需要检查每个函数的参数说明,确保准确。比如 VideoCapture 的参数可以是设备索引或文件路径,VideoWriter 的编码格式。鼠标事件的回调函数参数解释。
还要考虑用户可能的问题,比如中文显示乱码,这时候需要提到使用 Matplotlib 或其他方法。另外,视频播放的流畅性,如何处理帧率。
最后,整理结构,确保指南逻辑清晰,从基础到高级,每个部分有代码示例和应用场景。检查代码的正确性,比如文件读取、窗口销毁、资源释放等。
以下是 OpenCV HighGUI 模块的详细使用指南,涵盖核心功能、函数详解、代码示例及典型应用场景,结构清晰,实战性强:
OpenCV HighGUI 模块权威指南(Python 版)
一、模块概述
highgui
模块是 OpenCV 的图形用户界面与媒体 I/O 核心,提供以下核心功能:
- 图像显示:窗口管理、键盘交互
- 视频处理:摄像头捕获、视频文件读写
- 用户交互:鼠标事件、实时标注
- 媒体 I/O:图像 / 视频的读取与保存
二、核心功能详解与实战
1. 图像显示与窗口管理
1.1 核心函数
函数名称 | 功能描述 | 核心参数说明 | 示例代码 |
---|---|---|---|
cv2.imshow() | 显示图像 | winname (窗口名), mat (图像数据) | cv2.imshow("Image", img) |
cv2.waitKey() | 等待按键事件 | delay (毫秒,0 表示无限等待) | key = cv2.waitKey(0) |
cv2.destroyAllWindows() | 关闭所有窗口 | 无 | cv2.destroyAllWindows() |
cv2.namedWindow() | 创建可调整大小的窗口 | winname , flags=cv2.WINDOW_NORMAL | cv2.namedWindow("Resizeable", cv2.WINDOW_NORMAL) |
1.2 实战:图像查看器(支持按键保存)
python
import cv2# 读取图像
img = cv2.imread("example.jpg")
if img is None:raise FileNotFoundError("图像文件不存在")# 显示图像
cv2.imshow("Image Viewer", img)# 按键处理(ESC 退出,S 保存)
while True:key = cv2.waitKey(0)if key == 27: # ESCbreakelif key == ord('s'): # S 保存cv2.imwrite("saved_image.jpg", img)print("图像已保存")cv2.destroyAllWindows()
应用场景
- 图像标注:显示图像并通过按键标记类别(如
1
标记汽车,2
标记行人)。 - 医学影像查看:支持窗口缩放(
WINDOW_NORMAL
)和对比度调整。
2. 视频捕获与处理
2.1 核心函数
函数名称 | 功能描述 | 核心参数说明 | 示例代码 |
---|---|---|---|
cv2.VideoCapture() | 打开摄像头或视频文件 | index (设备索引,0 为内置摄像头)或文件路径 | cap = cv2.VideoCapture(0) |
cap.read() | 读取视频帧 | 无,返回 (ret, frame) | ret, frame = cap.read() |
cv2.VideoWriter() | 保存视频 | filename , fourcc , fps , frameSize | fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter("output.mp4", fourcc, 20.0, (640, 480)) |
2.2 实战:实时视频滤波(摄像头捕获)
python
import cv2
import numpy as np# 初始化摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():raise IOError("无法打开摄像头")# 初始化视频写入(可选)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter("filtered_video.mp4", fourcc, 20.0, (640, 480))while True:ret, frame = cap.read()if not ret:break# 实时滤波(高斯模糊)frame = cv2.GaussianBlur(frame, (5, 5), 0)# 显示与保存cv2.imshow("Live Filter", frame)out.write(frame) # 保存视频if cv2.waitKey(1) & 0xFF == 27: # ESC 退出break# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
应用场景
- 安防监控:实时捕获摄像头画面并保存(
VideoWriter
)。 - 手势识别:结合
VideoCapture
与imgproc
模块实现实时跟踪。
3. 用户交互(鼠标与键盘事件)
3.1 核心函数
函数名称 | 功能描述 | 核心参数说明 | 示例代码 |
---|---|---|---|
cv2.setMouseCallback() | 设置鼠标事件回调 | winname , on_mouse (回调函数) | cv2.setMouseCallback("Image", mouse_callback) |
cv2.getTrackbarPos() | 获取滑动条位置 | trackbarname , winname | threshold = cv2.getTrackbarPos("Thresh", "Control") |
3.2 实战:交互式图像标注(鼠标绘制矩形)
python
import cv2
import numpy as npdrawing = False
start_point = (-1, -1)def mouse_callback(event, x, y, flags, param):global drawing, start_pointif event == cv2.EVENT_LBUTTONDOWN:drawing = Truestart_point = (x, y)elif event == cv2.EVENT_MOUSEMOVE and drawing:# 实时绘制预览img_copy = param.copy()cv2.rectangle(img_copy, start_point, (x, y), (0, 255, 0), 2)cv2.imshow("Annotator", img_copy)elif event == cv2.EVENT_LBUTTONUP:drawing = Falsex1, y1 = start_pointx2, y2 = x, y# 保存 ROIroi = param[min(y1, y2):max(y1, y2), min(x1, x2):max(x1, x2)]cv2.imwrite("roi.jpg", roi)print(f"ROI 已保存:{(min(x1,x2), min(y1,y2), abs(x2-x1), abs(y2-y1))}")# 初始化
img = cv2.imread("scene.jpg")
cv2.namedWindow("Annotator")
cv2.setMouseCallback("Annotator", mouse_callback, img)while True:cv2.imshow("Annotator", img)if cv2.waitKey(1) & 0xFF == 27: # ESC 退出breakcv2.destroyAllWindows()
应用场景
- 数据集标注:鼠标绘制边界框并保存 ROI(如 COCO 格式)。
- 交互式调试:通过滑动条实时调整算法参数(如阈值、滤波核大小)。
三、完整应用场景实现
场景 1:实时视频目标跟踪(摄像头 + 鼠标交互)
流程
- 捕获视频帧 → 2. 鼠标选择跟踪区域 → 3. 实时跟踪 → 4. 显示结果。
完整代码
python
import cv2
import numpy as np# 初始化摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():raise IOError("摄像头打开失败")# 鼠标选择 ROI
roi_selected = False
roi = Nonedef select_roi(event, x, y, flags, param):global roi_selected, roiif event == cv2.EVENT_LBUTTONDOWN:roi = (x, y)elif event == cv2.EVENT_LBUTTONUP:x1, y1 = roix2, y2 = x, yroi = (min(x1, x2), min(y1, y2), abs(x2-x1), abs(y2-y1))roi_selected = True# 创建窗口并设置回调
cv2.namedWindow("Tracking")
cv2.setMouseCallback("Tracking", select_roi)while True:ret, frame = cap.read()if not ret:breakif roi_selected:# 简单跟踪(ROI 位置固定,实际项目需使用跟踪算法)x, y, w, h = roicv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.imshow("Tracking", frame)if cv2.waitKey(1) & 0xFF == 27: # ESC 退出breakcap.release()
cv2.destroyAllWindows()
场景 2:图像标注工具(支持键盘分类)
流程
- 显示图像 → 2. 鼠标绘制 ROI → 3. 键盘选择类别(1-5)→ 4. 保存标注。
完整代码
python
import cv2
import json# 配置
IMAGE_PATH = "dataset_image.jpg"
CLASSES = ["car", "person", "bike", "tree", "sky"]# 初始化
img = cv2.imread(IMAGE_PATH)
annotations = []
current_class = 0# 鼠标回调(绘制矩形)
drawing = False
start = (-1, -1)def mouse_callback(event, x, y, flags, param):global drawing, startif event == cv2.EVENT_LBUTTONDOWN:drawing = Truestart = (x, y)elif event == cv2.EVENT_LBUTTONUP:drawing = Falsex1, y1 = startx2, y2 = x, ybbox = [min(x1, x2), min(y1, y2), abs(x2-x1), abs(y2-y1)]annotations.append({"class": CLASSES[current_class],"bbox": bbox})print(f"标注保存:{CLASSES[current_class]} {bbox}")# 创建窗口
cv2.namedWindow("Annotator")
cv2.setMouseCallback("Annotator", mouse_callback)while True:# 绘制界面img_copy = img.copy()cv2.putText(img_copy, f"Class: {CLASSES[current_class]} (1-5)", (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)# 显示cv2.imshow("Annotator", img_copy)key = cv2.waitKey(1) & 0xFF# 键盘处理if key == 27: # ESC 退出breakelif 48 <= key <= 52: # 1-5 选择类别current_class = key - 48elif key == ord('s'): # S 保存with open("annotations.json", "w") as f:json.dump(annotations, f)print(f"保存 {len(annotations)} 个标注")cv2.destroyAllWindows()
四、最佳实践与注意事项
1. 资源管理
- 及时释放:视频捕获后务必调用
cap.release()
和out.release()
。 - 窗口清理:使用
destroyAllWindows()
避免内存泄漏。
2. 性能优化
- 降低分辨率:实时视频处理时缩小尺寸(
cv2.resize(frame, (640, 480))
)。 - 减少延迟:
waitKey(1)
替代waitKey(0)
提升帧率。
3. 中文显示
- HighGUI 不直接支持中文窗口标题,解决方案:
python
# 使用 Matplotlib 显示(支持中文) import matplotlib.pyplot as plt plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.title("中文标题") plt.show()
4. 视频编码
- 常见编码:
- MP4:
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
- AVI:
fourcc = cv2.VideoWriter_fourcc(*'XVID')
- MP4:
- 兼容性:使用
fourcc = -1
打开编码选择对话框(Windows 仅支持部分编码)。
五、函数速查表
功能分类 | 函数名称 | 核心参数示例 | 输出 / 用途 |
---|---|---|---|
图像显示 | cv2.imshow() | winname="Image", mat=img | 显示图像 |
视频捕获 | cv2.VideoCapture(0) | 设备索引(0 为摄像头) | 视频捕获对象 |
鼠标事件 | cv2.setMouseCallback() | winname, on_mouse | 注册鼠标回调函数 |
视频写入 | cv2.VideoWriter() | filename, fourcc, fps, size | 视频写入对象 |
按键处理 | cv2.waitKey(1) | 延迟(ms) | 等待按键(返回 ASCII 码) |
六、扩展学习建议
1. 滑动条交互(实时参数调整)
python
def on_trackbar(val):global thresholdthreshold = valcv2.namedWindow("Control")
cv2.createTrackbar("Threshold", "Control", 127, 255, on_trackbar)while True:threshold = cv2.getTrackbarPos("Threshold", "Control")# 使用 threshold 处理图像...
2. 多窗口管理
python
cv2.namedWindow("Original", cv2.WINDOW_AUTOSIZE)
cv2.namedWindow("Processed", cv2.WINDOW_NORMAL) # 可调整大小cv2.imshow("Original", img)
cv2.imshow("Processed", processed_img)
3. 视频编解码调试
python
# 打印支持的编解码器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
if fourcc == -1:print("不支持 MP4 编码,尝试其他格式(如 XVID)")
七、总结与学习路径
plaintext
HighGUI 学习路径:
基础 → 图像显示 → 视频捕获 → 鼠标交互 → 高级应用(标注工具、实时跟踪)推荐项目:
1. 交互式图像标注工具(鼠标 + 键盘)
2. 实时视频滤镜(摄像头 + 滑动条参数调整)
3. 视频稳定器(捕获 + 几何变换)性能优化:
- 视频流:使用 `CAP_FFMPEG` 后端加速(`cv2.VideoCapture("file.mp4", cv2.CAP_FFMPEG)`)
- 多线程:分离视频捕获与处理线程(`threading.Thread`)
八、完整代码仓库(示例)
python
# HighGUI 模块综合应用示例
import cv2# 1. 图像显示(支持按键保存)
img = cv2.imread("lena.jpg")
cv2.imshow("Image", img)
if cv2.waitKey(0) == ord('s'):cv2.imwrite("saved_lena.jpg", img)# 2. 视频捕获(摄像头 + 灰度转换)
cap = cv2.VideoCapture(0)
while cap.isOpened():ret, frame = cap.read()if not ret: breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow("Gray Video", gray)if cv2.waitKey(1) & 0xFF == 27:break
cap.release()# 3. 鼠标交互(绘制圆形)
def draw_circle(event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDBLCLK:cv2.circle(param, (x, y), 50, (0, 255, 0), -1)img = np.zeros((500, 500, 3), np.uint8)
cv2.namedWindow("Draw")
cv2.setMouseCallback("Draw", draw_circle, img)
while True:cv2.imshow("Draw", img)if cv2.waitKey(1) & 0xFF == 27:break
cv2.destroyAllWindows()
九、环境配置与依赖
bash
# 安装 OpenCV
pip install opencv-python# 验证安装
python -c "import cv2; print(cv2.__version__)" # 需 4.5+
通过此指南,开发者可全面掌握 HighGUI 模块的核心功能,从基础图像显示到复杂交互应用,结合标注工具、实时视频处理等实战项目,快速构建图形用户界面与媒体处理解决方案。每个代码示例均可独立运行,方便在实际开发中复用和扩展。建议结合官方文档(HighGUI 模块)进行深入学习。
相关文章:
OpenCV HighGUI 模块使用指南(Python 版)
用户让我编写一个 HighGUI 模块的使用指南,包括函数的使用和应用场景的实现。首先,我需要回顾 HighGUI 模块的主要功能:图像显示、视频捕获、鼠标和键盘事件。然后,按照用户提供的结构,整理每个部分的函数详解、代码示…...
SPI 机制与 Spring Boot AutoConfiguration 对比解析
一、架构效率革命性提升 1.1 类加载效率跃升 Spring Boot 2.7引入的AutoConfiguration.imports采用清单式配置加载,对比传统SPI机制: 传统SPI扫描路径:META-INF/services/** Spring Boot新方案:META-INF/spring/org.springfram…...
算法基础篇(1)(蓝桥杯常考点)
算法基础篇 前言 算法内容还有搜索,数据结构(进阶),动态规划和图论 数学那个的话大家也知道比较难,放在最后讲 这期包含的内容可以看目录 模拟那个算法的话就是题说什么写什么,就不再分入目录中了 注意事…...
【蓝桥杯速成】| 10.回溯切割
前面两篇内容我们都是在做有关回溯问题的组合应用 今天的题目主题是:回溯法在切割问题的应用 题目一:分割回文串 问题描述 131. 分割回文串 - 力扣(LeetCode) 给你一个字符串 s,请你将 s 分割成一些 子串ÿ…...
【Spring】深入理解 Spring 事务管理
文章目录 一、事务的基本概念原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability) 二、Spring 事务管理的优势简化事务管理代码提供多种事务管理方式整合…...
java学习笔记6
按住shift键,选择开始的一位和最后结束的一位来全选 面向对象特征之二:继承性(inheritance) 面向对象特征之二:继承性1.继承性的理解 > 生活上:财产的继承、颜值的继承 > 代码层面:> 自上而下:定义了一个类A,在定义另一个类B时&…...
人工智能在现代科技中的应用和未来发展趋势
人工智能(Artificial Intelligence,AI)是一种模拟人类智能思维和行为的技术,已经在现代科技中得到广泛应用。以下是人工智能在现代科技中的应用和未来发展趋势: 应用: 机器学习:机器学习是人工…...
第二十一章:模板与继承_《C++ Templates》notes
模板与继承 重点和难点编译与测试说明第一部分:多选题 (10题)第二部分:设计题 (5题)答案与详解多选题答案:设计题参考答案 测试说明 重点和难点 21.1 空基类优化(EBCO) 知识点 空基类优化(Empty Base Cla…...
STC89C52单片机学习——第35节: [16-1] AD/DA
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.23 51单片机学习——第35节: [16-1] AD/DA 前言开发板说明引用解答和科普一、AD问题…...
算法-最大公约数
1、约数: 1.1 试除法求约数 原理:只需要遍历最小的约数即可,较大的那个可以直接算出来。 import java.util.*; public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {int t sc.nextIn…...
在 SaaS 应用上构建 BI 能力的实战之路
SaaS 产品在持续运营过程中积累了大量数据,这些数据不仅是数字的记录,更是洞察市场趋势、优化产品功能、提升用户体验的宝贵资源。 因此,大部分的 SaaS 产品在发展到一定阶段后,都会开始构建自己的报表模块或分析模块,…...
代码随想录刷题day51|(二叉树篇)654.最大二叉树
一、二叉树基础知识 详见:代码随想录刷题day34|(二叉树篇)二叉树的递归遍历-CSDN博客 二、递归思路 递归三部曲 构造树一般采用前序遍历,因为先构造中间节点,然后递归构造左子树和右子树; 1.递归函数参数…...
深入理解 C++11 智能指针:独占、共享与弱引用的完美管理
文章目录 std::unique_ptr(独占式智能指针)std::shared_ptr(共享式智能指针)std::weak_ptr(弱引用智能指针)示例展示:智能指针的原理内存泄漏**什么是内存泄漏,内存泄漏的危害****如…...
1.2 编译器结构
编译器具有模块化的高层结构。还可以将模块化进一步细化。编译器可以看成多个阶段构成的流水线结构。 一种没有优化的编译器结构 更复杂的编译器结构...
文件操作助手
文件操作助手 在我们实现一个大型项目时,往往会有一个公共模块,这个公共模块是公用的,里面可能会包含文件操作助手、字符串操作助手、时间戳操作助手… 而我们今天就来实现一个文件操作助手,里面包含的功能有: 判断…...
线段树与扫描线 —— 详解算法思想及其C++实现
目录 一、线段树(Segment Tree) 基本概念 结构 操作 示例代码 二、扫描线(Sweep Line) 基本概念 应用场景 示例代码(矩形面积并集) 三、总结 一、线段树(Segment Tree) 基本…...
Leetcode 刷题笔记1 图论part04
leetcode 110 字符串接龙 def judge(s1, s2):count 0for i in range(len(s1)):if s1[i] ! s2[i]:count 1return count 1if __name__ __main__:n int(input())begin_str, end_str map(str, input().split())if begin_str end_str:print(0)exit()strlist []for _ in ran…...
快速入手:Nacos融合SpringCloud成为注册配置中心
快速入手:Nacos融合SpringCloud成为注册配置中心 前言安装Nacos项目搭建添加配置启动类添加注解运行项目服务调用RestTemplate 模式FeignClient 模式 前言 Spring Cloud是一系列框架的集合,提供了微服务架构下的各种解决方案,如服务治理、配…...
others-rustdesk远程
title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…...
go:前后端分离
1.前端代码 新建一个前端文件夹,在该文件夹下新建一个.html文件,写入自己的html代码。 前端搞定。 2.后端代码 其核心是挂载路由接受前端传来的数据核心代码如下: func main() { // 服务运行提示 fmt.Println("go web server is runn…...
lodash 学习笔记/使用心得
lodash 学习笔记/使用心得 简单记一下 lodash 的一点学习笔记使用心得,最近也是打算清理一下所有的 dead code,然后发现我们用了好多的 lodash 方法。对比了之前的写法,重新看了一下官方文档,再自己重新动手写了点 util 之后发现…...
网络爬虫【爬虫库request】
我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库,完全满足如今网络爬虫的需求。与Urllib对比,Requests不仅具备Urllib的全部功能;在开发使用上&…...
AI日报 - 2025年3月24日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | Lyra生物序列建模架构效率惊人 在100生物任务中达最优,推理速度提升高达12万倍 ▎💼 商业动向 | OpenAI用户破4亿,Meta与Reliance探讨AI合作 生态扩展与全…...
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
一、前言 在移动互联网蓬勃发展的今天,视频播放功能已成为众多Android应用的核心特性之一。面对多样化的视频格式和传输协议,开发一款高效、稳定的视频播放器是许多开发者追求的目标。FLV(Flash Video)格式,尽管随着H…...
动态规划——混合背包问题
动态规划——混合背包问题 混合背包问题01背包与完全背包的混合:完全背包与多重背包的混合:三种背包混合混合背包OJ汇总 混合背包问题 将01背包、完全背包、多重背包混合起来的背包问题。也就是说,有的物品只可以取一次(01背包&a…...
数据库操作练习
一.向heros表中新增一列信息,添加一些约束,并尝试查询一些信息 //向表中添加一列age信息 alter table heros add column age int;//id列添加主键约束,设置自增 alter table heros modify column id int auto_increment primary key;//name列…...
3.milvus索引-HNSW
索引作用 加速大型数据集上的查询。 向量字段,仅只能创建一个索引。 milvus支持的向量索引类型大部分使用 近似最近邻搜索算法。ANNS该算法的核心不局限于返回最准确的结果,而是仅搜索目标的邻居。ANNS通过在可接受的范围内牺牲准确性提高检索效率。 …...
算法基础——栈
一、栈的概念 栈是⼀种只允许在⼀端进⾏数据插⼊和删除操作的线性表。 进⾏数据插⼊或删除的⼀端称为栈顶,另⼀端称为栈底。不含元素的栈称为空栈。进栈就是往栈中放⼊元素,出栈就是将元素弹出栈顶。 二、栈的模拟实现 1. 创建 本质还是线性表&#…...
开发语言漫谈-groovy
groovy是一门脚本语言,在前期的脚本语言中简单介绍了下。现在再深入介绍下,因为它是本平台上选用的脚本语言。所谓脚本语言就是不用编译,直接执行。这种特色非常适合做嵌入编程,即编即用。我们知道平台后台的业务开发语言是Java&a…...
ArkUI-List组件
列表是一个复杂的容器,当列表项达到一定数量,使得列表内容超出其范围的时候,就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用,条件渲染,循环渲染,懒加载等渲染控制方式生成子组件…...
数据仓库的 DWD 分层架构:构建高效数据平台的基石
在数据驱动的时代,数据仓库(Data Warehouse)作为企业数据分析的核心基础设施,扮演着至关重要的角色。而数据仓库的分层设计,则是确保数据高效流转、提升数据质量、支持复杂分析的关键。本文将深入探讨数据仓库的 DWD 分…...
山东大学数据结构课程设计
题目:全国交通咨询模拟系统 问题描述 处于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能地短,出门旅游的旅客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编织一个全国城市间的交…...
动态规划-01背包
兜兜转转了半天,发现还是Carl写的好。 看过动态规划-基础的读者,大概都清楚。 动态规划是将大问题,分解成子问题。并将子问题的解储存下来,避免重复计算。 而背包问题,就是动态规划延申出来的一个大类。 而01背包&…...
【2025】基于node.js的中医药科普平台的设计与实现(源码、万字文档、图文修改、调试答疑)
项目完整功能以演示视频为准 基于Node.js的中医药科普平台的设计与实现功能结构图如下 课题背景 随着人们健康意识的提高,中医药作为传统医学的重要组成部分,越来越受到关注。然而,中医药知识专业性强,普通大众获取准确、全面的中…...
基于Flux模型的多模态可控图像生成工作流实践
一、技术框架与模型选型 当前图像生成领域对多模态控制与一致性保持的需求日益增强,本文将基于Black Forest Labs推出的Flux.1模型,结合ControlNet的循环一致性优化技术,构建一套融合Canny边缘检测与深度图(Depth)控制…...
缓存过期时间之逻辑过期
1. 物理不过期(Physical Non-Expiration) 定义:在Redis中不设置EXPIRE时间,缓存键永久存在(除非主动删除或内存淘汰)。目的:彻底规避因缓存自动过期导致的击穿(单热点失效ÿ…...
JVM类加载过程详解
文章目录 前言1.加载2.链接验证文件格式验证元数据验证字节码验证符号引用验证 准备解析 3.初始化4.类卸载 前言 类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为 7 个阶段:加载(Loading)、验证&a…...
第三十二篇 深入解析Kimball维度建模:构建企业级数据仓库的完整框架
目录 一、维度建模设计原则深度剖析1.1 业务过程驱动设计1.2 星型模式VS雪花模式 二、维度建模五步法实战(附完整案例)2.1 业务需求映射2.2 模型详细设计2.3 缓慢变化维处理 三、高级建模技术解析3.1 渐变维度桥接表3.2 快照事实表设计 四、性能优化体系…...
WPF 布局中的共性尺寸组(Shared Size Group)
1. 什么是共性尺寸组? 在 WPF 的 Grid 布局中,SharedSizeGroup 允许多个 Grid 共享同一列或行的尺寸,即使它们属于不同的 Grid 也能保持大小一致。这样可以保证界面元素的对齐性,提高布局的一致性。 SharedSizeGroup 主要用于需…...
19 数码管的动态显示
1、八段数码管 八段数码管 是一个 “ 8 ” 字型数码管,分为八段,a b c d e f g dp,其中dp为小数点。每一段为一个发光二极管,这样的 8 段称为 段选信号 。 2、实验 1、实验目标:让六位数码管 从 0 开始记数࿰…...
pytorch 笔记:张量索引的维度扩展规则
1 基本原理 在PyTorch中,张量索引的维度扩展规则遵循以下原则: 索引操作的核心规则: 当使用索引数组访问张量时: 索引数组的每个元素对应选取原张量的一个子张量结果形状 索引数组形状 原张量剩余维度形状 这么说可能不清…...
课外活动:怎么理解可变成本?
可变成本深度解析 🧮 一、可变成本的本质 #mermaid-svg-qoqQaFxQBuZZfAD2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qoqQaFxQBuZZfAD2 .error-icon{fill:#552222;}#mermaid-svg-qoqQaFxQBuZZfAD2 …...
深入理解 JVM 的垃圾收集器:CMS、G1、ZGC
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法
本篇文章主要讲解IDEA、phpStrom、webStrom、pyCharm等jetbrains系列编辑器无法进行全局搜索内容问题的主要原因及解决办法。 日期:2025年3月22日 作者:任聪聪 现象描述: 1.按下ctrlshiftf 输入法转为了繁体。 2.快捷键ctrlshiftr 可以全局检…...
智慧高速,安全护航:视频监控平台助力高速公路高效运营
随着我国高速公路里程的不断增长,交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求,而监控视频平台的出现,则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…...
括弧匹配检验(信息学奥赛一本通-1354)
【题目描述】 假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ࿳…...
MacOS安装 nextcloud 的 Virtual File System
需求 在Mac上安装next cloud实现类似 OneDrive 那样,文件直接保存在服务器,需要再下载到本地。 方法 在 官网下载Download for desktop,注意要下对版本,千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…...
【秣厉科技】LabVIEW工具包——OpenCV 教程(11):人脸检测与识别
文章目录 前言级联分类器FaceDetectorYNFaceRecognizerSF1. 特征提取2. 人脸对比3. 人脸身份识别(最佳匹配法) 总结 前言 需要下载安装OpenCV工具包的朋友,请前往 此处 ;系统要求:Windows系统,LabVIEW>…...
C++-C++中的几种cast
文章目录 static_castPOD类型互转任意指针类型与void*互转基类继承类之间的互转具有目标类型转换函数的类/单参数的构造函数 dynamic_castreinterpret_cast static_cast 所谓static,意思是在编译期进行的转换,static_允许如下转换: POD类型…...
list的模拟实现和学习
1. list的介绍及使用 说白了就是带头循环双向循环链表 stl 的两大组件就是容器和算法 ,他们两个之间是通过迭代器进行联系的 这三种算法函数 迭代器的种类 性质(容器底层结构决定) 单项: forward_list /哈希(unord…...