OpenCv高阶(九)——背景建模
目录
一、背景建模的核心目标与核心挑战
1. 核心目标
2. 核心挑战
二、背景建模模型
1、帧差法原理
2. 概率模型(Parametric Models)
(1)高斯混合模型(Gaussian Mixture Model, GMM)
(2)单高斯模型(Single Gaussian Model)
3. 非参数模型(Non-Parametric Models)
(1)K 近邻(K-Nearest Neighbors, KNN)
(2)ViBe 算法(Visual Background Extractor)
三、主流背景建模算法对比与解析
1. MOG2(Gaussian Mixture-Based Background Subtraction)
(1)算法原理
(2)OpenCV 实现
(3)优缺点
2. KNN 背景减除
(1)算法原理
(2)OpenCV 实现
(3)优缺点
3. GMG(Gaussian Mixture-based Background Subtraction with GMG)
(1)算法原理
(2)OpenCV 实现(需手动实现核心逻辑)
(3)优缺点
4. CNT(Codebook Background Subtraction)
(1)算法原理
(2)OpenCV 实现(需安装opencv-contrib-python)
(3)优缺点
5. ViBe 算法(Visual Background Extractor)
(1)算法原理
(2)手动实现核心逻辑
(3)优缺点
四、背景建模的完整实现流程(以 MOG2 为例)
1. 输入预处理
2. 背景模型初始化
3. 前景提取与后处理
4. 背景模型更新
五、背景建模代码逐步分解
1. 初始化环境与读取视频
2. 预处理工具准备
3. 逐帧处理主循环
(1) 读取视频帧
(2) 显示原始帧
(3) 背景减除获取前景掩膜
(4) 形态学开运算去噪
(5) 轮廓检测与筛选
(6) 显示检测结果
4. 资源释放
完整代码展示
六、总结:如何选择合适的背景建模算法
在计算机视觉中,背景建模(Background Modeling) 是从视频序列中分离动态前景与静态背景的核心技术,广泛应用于运动检测、目标跟踪、视频监控等领域。它通过学习场景的统计特性构建背景模型,并实时更新以适应环境变化。在视频中,背景通常被定义为相对稳定的部分,例如墙壁、地面或天空等。背景建模的目标是将动态的前景对象与静态的背景进行分离,以便进一步分析和处理。
一、背景建模的核心目标与核心挑战
1. 核心目标
- 动态分割:实时区分前景(运动物体)与背景(静态或缓慢变化的场景)。
- 环境适应:处理光照变化、动态背景(如晃动的树叶、水流)、相机抖动等干扰。
- 高效稳定:在计算效率(实时性)与分割精度之间平衡,适应不同硬件平台(CPU/GPU/ 嵌入式)。
2. 核心挑战
- 动态背景:背景元素本身运动(如旋转的风扇、流动的河水),易被误判为前景。
- 光照突变:突然的亮度 / 色温变化(如开灯、阴天转晴天),导致背景模型失效。
- 相机运动:手持设备拍摄或无人机航拍时,全局运动干扰局部前景检测。
- 初始化阶段:前几帧需无运动物体干扰,否则背景模型包含错误信息。
二、背景建模模型
1、帧差法原理
由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。
帧差法的优缺点:
帧差法非常简单,但是会引入噪音和空洞(人物中间是黑色的)问题。
2. 概率模型(Parametric Models)
假设像素值服从特定概率分布,通过参数估计(如均值、方差)描述背景。
(1)高斯混合模型(Gaussian Mixture Model, GMM)
- 核心思想:每个像素的背景由 K 个高斯分布混合表示,权重反映该分布的 “重要性”。
- 数学表达:
- 更新策略:通过在线 EM 算法更新高斯分布的参数,淘汰低权重分布,纳入新观测值。
(2)单高斯模型(Single Gaussian Model)
- 简化版:假设背景像素服从单一高斯分布,适合静态背景(如固定摄像头监控场景)。
- 缺点:无法处理多模态背景(如周期性运动的风扇叶片)。
3. 非参数模型(Non-Parametric Models)
不假设像素值的分布形式,直接存储历史观测值作为背景模型。
(1)K 近邻(K-Nearest Neighbors, KNN)
- 核心思想:当前像素与历史 K 个最近邻像素比较,若距离小于阈值则为背景,否则为前景。
- 距离度量:通常使用欧氏距离或曼哈顿距离。
- 优点:对多模态背景鲁棒性强,无需假设分布形式。
(2)ViBe 算法(Visual Background Extractor)
- 核心思想:从初始帧随机选取像素样本作为背景模型,通过时空一致性(邻域像素和时间帧)更新模型。
- 创新点:
- 空间邻域:利用当前像素的 8 邻域样本增强模型鲁棒性。
- 随机子采样:每个像素仅更新少量样本,降低计算量。
三、主流背景建模算法对比与解析
1. MOG2(Gaussian Mixture-Based Background Subtraction)
(1)算法原理
- 每个像素用 K=3~5个高斯分布建模,按权重和方差排序,前 B 个分布构成背景
- 支持动态更新背景模型,适应光照变化和缓慢运动的背景(如旋转的吊灯)。
(2)OpenCV 实现
bg_subtractor = cv2.createBackgroundSubtractorMOG2(history=500, # 参与背景建模的历史帧数varThreshold=16, # 像素值与背景模型的方差阈值detectShadows=True # 检测阴影(阴影标记为灰色,非前景)
)
fg_mask = bg_subtractor.apply(frame) # 输出二值掩码(255=前景,0=背景,128=阴影)
(3)优缺点
- 优点:速度较快(CPU 下约 20fps),支持阴影检测,适合监控视频。
- 缺点:对快速变化的背景(如突然开关灯)适应较慢,内存占用随历史帧数增加。
2. KNN 背景减除
(1)算法原理
- 为每个像素维护一个历史观测值队列(如最近 500 帧的像素值),通过 KNN 搜索判断当前像素是否属于背景。
- 距离阈值动态调整,适应不同场景的噪声水平。
(2)OpenCV 实现
bg_subtractor = cv2.createBackgroundSubtractorKNN(history=500, # 历史帧数dist2Threshold=400, # 平方距离阈值(值越大,检测到的前景越少)detectShadows=True
)
fg_mask = bg_subtractor.apply(frame)
(3)优缺点
- 优点:对动态背景(如水流、火焰)鲁棒性强,适合自然场景。
- 缺点:计算复杂度高(O (K) 近邻搜索),内存占用大(存储所有历史样本)。
3. GMG(Gaussian Mixture-based Background Subtraction with GMG)
(1)算法原理
- 初始化阶段:前 N 帧(如 30 帧)用于构建初始背景模型,假设背景像素服从高斯分布。
- 在线阶段:通过贝叶斯推理更新背景模型,每个像素的前景概率由当前帧与背景模型的差异计算得到。
- 创新点:引入 “软判决”,用概率掩码而非硬二值化,提升边缘检测精度。
(2)OpenCV 实现(需手动实现核心逻辑)
class GMGModel:def __init__(self, initial_frames, history=120):self.gmm = cv2.createBackgroundSubtractorMOG2(history=history)for frame in initial_frames:self.gmm.apply(frame) # 预训练背景模型def apply(self, frame):return self.gmm.apply(frame, learningRate=0.01) # 低学习率缓慢更新
(3)优缺点
- 优点:初始化快,适合静态相机场景(如门禁监控)。
- 缺点:相机移动或剧烈光照变化时易失效。
4. CNT(Codebook Background Subtraction)
(1)算法原理
- 每个像素的背景用码本表示,码本包含多个码字(颜色区间),覆盖该像素可能的取值范围。
- 码字通过聚类算法生成,支持多模态分布(如周期性变化的像素值)。
(2)OpenCV 实现(需安装opencv-contrib-python
)
import cv2.bgsegm as bgsegm
bg_subtractor = bgsegm.createBackgroundSubtractorCNT(use_history=True, # 是否使用历史帧更新码本maxPixelDistance=30 # 像素与码字的最大距离
)
fg_mask = bg_subtractor.apply(frame)
(3)优缺点
- 优点:抗噪声能力强,适合高动态范围场景(如夜间车灯变化)。
- 缺点:计算复杂度高,内存占用大(每个像素存储多个码字)。
5. ViBe 算法(Visual Background Extractor)
(1)算法原理
- 初始化:从第一帧随机选取 200 个邻域像素作为背景样本(每个像素维护一个样本集合)。
- 更新策略:
- 每个像素以小概率(如 1/16)用当前值替换样本集合中的随机样本。
- 利用空间邻域的样本一致性,抑制孤立噪声点。
(2)手动实现核心逻辑
class ViBe:def __init__(self, frame, sample_size=200, radius=20):self.sample_size = sample_sizeself.radius = radiusself.samples = np.zeros((frame.shape[0], frame.shape[1], sample_size), dtype=np.uint8)# 初始化:每个像素随机选取邻域样本for i in range(frame.shape[0]):for j in range(frame.shape[1]):self.samples[i,j] = self._sample_neighbors(frame, i, j)def _sample_neighbors(self, frame, i, j):# 从3x3邻域随机选取sample_size个样本(包括自身)neighbors = frame[max(0,i-1):min(frame.shape[0],i+2), max(0,j-1):min(frame.shape[1],j+2)].ravel()return np.random.choice(neighbors, self.sample_size, replace=False)def apply(self, frame):fg_mask = np.zeros(frame.shape[:2], dtype=np.uint8)for i in range(frame.shape[0]):for j in range(frame.shape[1]):# 计算当前像素与样本的距离dist = np.sum(np.abs(self.samples[i,j] - frame[i,j]) < self.radius)if dist < 20: # 小于匹配阈值,判为前景fg_mask[i,j] = 255# 以1/16概率更新样本(仅前景像素更新)if np.random.rand() < 1/16:self.samples[i,j][np.random.randint(0, self.sample_size)] = frame[i,j]else:# 背景像素以1/16概率更新样本,并扩散到邻域if np.random.rand() < 1/16:ni, nj = self._get_random_neighbor(i,j)self.samples[ni,nj][np.random.randint(0, self.sample_size)] = frame[i,j]return fg_mask
(3)优缺点
- 优点:速度极快(单帧处理时间 < 1ms),内存效率高,适合嵌入式设备。
- 缺点:依赖第一帧初始化,相机移动时需重新校准。
四、背景建模的完整实现流程(以 MOG2 为例)
1. 输入预处理
- 灰度化:将彩色图像转为灰度图(减少计算量,多数算法基于单通道)。
- 缩放:降低分辨率(如从 1920x1080 缩至 640x480),提升实时性。
frame = cv2.resize(frame, (640, 480))
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
2. 背景模型初始化
- 前
history
帧用于训练背景(期间避免运动物体干扰,或通过参数允许动态更新)。
bg_subtractor = cv2.createBackgroundSubtractorMOG2(history=200)
for _ in range(200):bg_subtractor.apply(gray) # 预训练背景
3. 前景提取与后处理
- 形态学操作:腐蚀(去除小噪声点)和膨胀(连接断裂的前景区域)。
- 轮廓检测:提取前景轮廓,过滤面积过小的区域(如面积 < 50 像素的噪声)。
fg_mask = bg_subtractor.apply(gray)
fg_mask = cv2.erode(fg_mask, None, iterations=2)
fg_mask = cv2.dilate(fg_mask, None, iterations=2)
contours, _ = cv2.findContours(fg_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:if cv2.contourArea(cnt) > 50: # 过滤小轮廓x, y, w, h = cv2.boundingRect(cnt)cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)
4. 背景模型更新
- 自适应学习率:
bg_subtractor.apply(frame, learningRate=0.01)
,学习率越小,模型更新越慢(0 表示固定背景,1 表示完全用当前帧更新)。
五、背景建模代码逐步分解
1. 初始化环境与读取视频
import cv2
cap = cv2.VideoCapture('../data/test.avi')
-
任务:
-
导入OpenCV库,提供图像处理、视频读写等基础功能。
-
创建
VideoCapture
对象,读取指定路径的视频文件,为逐帧处理做准备。
-
2. 预处理工具准备
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
fgbg = cv2.createBackgroundSubtractorMOG2()
-
任务:
-
形态学核:创建3x3十字形结构元素,用于后续开运算(去噪)。
-
背景建模器:初始化MOG2背景减除算法,动态建模背景,分离运动前景(如行人、车辆)。
-
3. 逐帧处理主循环
(1) 读取视频帧
ret, frame = cap.read()
if not ret:break
-
任务:
-
读取视频的下一帧数据,
ret
判断是否成功读取(失败则退出循环)。 -
frame
变量存储当前帧的BGR图像数据,用于后续处理与显示。
-
(2) 显示原始帧
cv2.imshow('frame', frame)
-
任务:
-
实时显示原始视频帧,用于直观对比处理前后的效果。
-
(3) 背景减除获取前景掩膜
fgmask = fgbg.apply(frame)
-
任务:
-
应用MOG2算法,动态更新背景模型,生成前景二值掩膜。
-
输出:白色区域表示运动目标(前景),黑色为背景。
-
光流关联:此步骤定位可能发生运动的区域,为后续光流计算缩小范围(减少计算量)。
-
(4) 形态学开运算去噪
fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
cv2.imshow('fgmask1', fgmask_new)
-
任务:
-
开运算:先腐蚀后膨胀,消除细小噪声点(如树叶晃动、光照变化)。
-
显示处理后的前景掩膜,验证去噪效果。
-
光流优化:干净的掩膜可提高光流估计的准确性,避免噪声干扰运动向量计算。
-
(5) 轮廓检测与筛选
_, contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:perimeter = cv2.arcLength(c, True)if perimeter > 188:x,y,w,h = cv2.boundingRect(c)frame = cv2.rectangle(frame, (x,y), (x+w,y+h), (0,0,255), 2)
-
任务:
-
轮廓检测:在二值掩膜中查找连通区域,获取所有潜在运动目标的轮廓。
-
周长过滤:通过阈值(188)剔除小轮廓(噪声),保留显著运动物体。
-
绘制边界框:在原始帧上用红色矩形标记运动目标的位置。
-
光流定位:框选区域可作为光流算法的输入ROI(Region of Interest),针对性计算运动方向与速度。
-
(6) 显示检测结果
cv2.imshow('frame_new_rect', frame)
k = cv2.waitKey(1)
if k == 27:break
-
任务:
-
显示带检测框的实时视频,直观反馈算法效果。
-
检测键盘输入,按下ESC键(ASCII 27)退出循环。
-
4. 资源释放
cap.release()
cv2.destroyAllWindows()
-
任务:
-
释放视频捕获对象,关闭所有OpenCV窗口,防止内存泄漏。
-
完整代码展示
# 导入OpenCV库,用于计算机视觉任务
import cv2# 获取视频信息:创建VideoCapture对象,读取视频文件
cap = cv2.VideoCapture('../data/test.avi')# 创建形态学操作核:使用3x3的十字形结构元素,用于后续的开运算去噪
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
# 创建背景减除器:使用MOG2算法进行动态背景建模,用于提取运动前景
fgbg = cv2.createBackgroundSubtractorMOG2()# 主循环:逐帧处理视频
while True:# 读取当前帧:ret表示读取状态,frame为图像数据ret, frame = cap.read()# 检查帧是否读取成功,失败则退出循环if not ret:break# 显示原始视频帧cv2.imshow('frame', frame)# 应用背景减除器:获得前景掩膜(二值图像,白色代表前景运动区域)fgmask = fgbg.apply(frame)# 形态学开运算处理:去除前景掩膜中的小噪声点fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)cv2.imshow('fgmask1', fgmask_new) # 显示处理后的前景掩膜# 查找轮廓:检测二值图像中的连通区域# 参数说明:RETR_EXTERNAL只检测外部轮廓,CHAIN_APPROX_SIMPLE压缩水平、垂直和对角线段# 注意:OpenCV版本不同返回值可能不同,新版返回两个值(contours, hierarchy)_, contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍历所有检测到的轮廓for c in contours:# 计算轮廓周长(permier应为perimeter,变量名拼写错误)perimeter = cv2.arcLength(c, True)# 筛选较大轮廓:周长阈值设为188(根据场景调整,用于过滤小噪声)if perimeter > 188:# 获取轮廓的外接矩形坐标x, y, w, h = cv2.boundingRect(c)# 在原始帧上绘制红色矩形框(BGR格式:(0,0,255)为红色)frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)# 显示带检测框的结果帧cv2.imshow('frame_new_rect', frame)# 检测按键输入:ESC键(ASCII 27)退出循环k = cv2.waitKey(1)if k == 27:break# 释放资源(隐式执行,但显式释放更规范)
cap.release()
cv2.destroyAllWindows()
六、总结:如何选择合适的背景建模算法
场景需求 | 推荐算法 | 核心参数调优 |
---|---|---|
固定摄像头,静态背景 | GMG、单高斯模型 | history=100 , detectShadows=True |
动态背景(如树叶、水流) | KNN、ViBe | K=50 , radius=20 (ViBe) |
实时性优先(嵌入式设备) | ViBe、简化 MOG2 | history=200 , varThreshold=25 |
复杂光照变化 | CNT、MOG2 | detectShadows=True , 低学习率(0.001) |
多模态背景(周期性运动) | GMM(K=3~5) | 增加高斯分布数量,动态调整背景比例阈值 |
背景建模是视频分析的基石,其核心价值在于平衡模型鲁棒性与计算效率。通过理解不同算法的适用场景、参数含义及后处理技巧,结合具体硬件条件和场景需求,可实现精准的前景提取,为上层计算机视觉任务奠定坚实基础。
相关文章:
OpenCv高阶(九)——背景建模
目录 一、背景建模的核心目标与核心挑战 1. 核心目标 2. 核心挑战 二、背景建模模型 1、帧差法原理 2. 概率模型(Parametric Models) (1)高斯混合模型(Gaussian Mixture Model, GMM) (…...
Docker Macvlan网络配置实战:解决“network already exists“错误
一、Macvlan网络的应用场景 Macvlan是Docker支持的多种网络驱动之一,它允许容器直接绑定到宿主机的物理接口,为每个容器分配独立的MAC地址。这种网络模式特别适合需要容器直接暴露在物理网络中的场景,例如: • IoT设备直接通信 …...
Android——Activity与Fragment通信
Activity向Fragment传递数据 Activity.java Bundle bundle new Bundle();bundle.putString("message", "wonima");BlankFragment bf new BlankFragment();bf.setArguments(bundle);Fragment.java Overridepublic View onCreateView(LayoutInflater infl…...
38 python random
在实际中,我们常常会用到随机的概念,比如 模拟抽奖活动(如:月度优秀员工抽奖)生成测试数据(如:随机考勤时间、随机销售额)打乱数据顺序(如:随机分配任务到人)Python 的random模块就像你的 "随机事件生成器",帮你轻松创建各种随机数据 一、基础操作:从随…...
二叉树的遍历(广度优先搜索)
二叉树的第二种遍历方式,层序遍历,本质是运用队列对二叉树进行搜索。 层序遍历是指将二叉树的每一层按顺序遍历,通过队列实现就是先将根节点push入队,统计此时的队列中的元素数量size,将size元素全部pop出去࿰…...
设备接入与APP(应用程序)接入华为云iotDA平台的详细操作步骤及获取方式
壹、设备登录 IoTDA 的通关清单详细操作路径及获取方式 下面将之前整理的“设备登录 IoTDA 的通关清单”补充为带有详细操作路径的实用指南,逐项说明这些信息在哪里查、怎么查、怎么用,可以一步步操作落地,无需额外查文档。 ✅【完整版】设备…...
100个用户的聊天系统:轮询 vs WebSocket 综合对比
📊 对比表 对比维度普通轮询(Polling)WebSocket实时性⏳ 一般(延迟轮询间隔)例如 5 秒轮询,平均延迟 2.5 秒⚡️ 高(消息可毫秒级送达)数据库压力🚨 高(每次…...
第四章第四节 Spark-Streaming核心编程(三)
打开kafka集群 Spark Streaming支持多种数据源接入方式,有两种典型场景 基于Filebeat的目录监控:通过Filebeat实时监控指定目录(如日志目录),将新增文件内容采集并推送至Kafka消息队列。这种方式适用于需要持久化数据的…...
IDEA编写flinkSQL(快速体验版本,--无需配置环境)
相关资料 文档内容链接地址datagen生成器https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/connectors/table/datagen/print 生成器https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/connectors/table/print/ 准备工作 优点就是下载个ide…...
树莓派4B+Ubuntu24.04 电应普超声波传感器串口输出 保姆级教程
1. 背景 我的机器人上要用到超声波测距,因此就选了电应普的1拖4的超声波测距模块。用的是UART受控输出。这个模块的使用很简单,这里做一个笔记,也是对大家的一个参考。 2. 保姆级教程 刚刚说了,这东西很简单,就是一…...
Aloudata Agent :基于 NoETL 明细语义层的分析决策智能体
今天的分享包含四方面内容。首先,谈谈企业在数据分析智能体(Agent)探索时所面临的挑战;其次,介绍 Aloudata Agent 的关键技术创新点;第三,作为首次亮相,我们将通过产品演示揭晓产品 …...
C++学习-入门到精通-【1】C++编程入门,输入/输出和运算符
C学习-入门到精通-【1】C编程入门,输入/输出和运算符 C编程入门,输入/输出和运算符 C学习-入门到精通-【1】C编程入门,输入/输出和运算符第一个C程序:输出一行文本算术运算 第一个C程序:输出一行文本 // 文本打印程序…...
力扣-234.回文链表
题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 class Solution { public:bool isPalindrome(ListNode* head) {//快慢指针找到中间结点p1(偶数个结点…...
Electron从入门到入门
项目说明 项目地址 项目地址:https://gitee.com/ruirui-study/electron-demo 本项目为示例项目,代码注释非常清晰,给大家当做入门项目吧。 其实很多东西都可以在我这基础上添加或修改、市面上有些已开源的项目,但是太臃肿了&am…...
【华为HCIP | 华为数通工程师】821—多选解析—第十七页
多选835、IS-IS协议所使用的NSAP地址主要由哪几个部分构成? A、AREA ID B、SEL C、DSCp D、SYSTEM ID 解析:NSAP地址:网络服务访问点(Network Service Access Point)是 OSI 协议中用于定位资源的地址。NSAP 的地址结构如图所示,它由 IDP(Initial Domain …...
electron-builder 打包安装与启动手动安装,最终解决方案,之前的文章与其他的人都不用看了。
介绍 最近官网出了个electron-forge,但打包之后的软件包有问题会有个多余的遮罩物挡在软件的最前面,太恶心了。研究了很久硬是没法去掉。没办法只能重温electron-builder工具来进行打包。之前用过这个安装过一次,也是耗费了好几天。而且也做好了笔记,有资料的情况下,我万万…...
conda安装cuda+cudnn+pytorch【一条龙服务,以cuda12.1版本为例】
安装步骤在Windows和ubuntu系统中应该是一致的,建议浏览一遍文章再尝试配置环境 一、创建新的虚拟环境 这里以Anaconda为例,打开终端 创建新的虚拟环境,test_torch可替换为别的名字(自定义),3.10也可以改…...
ElementUi的tabs样式太难修改,自定义tabs标签页
ElementUi的Tabs组件在某些情况下难以是自己想要的样式,这时候自定义 Tabs 会是一个更好的选择,可以根据自己想要而设置样式,如图: 一、ElementUi的Tabs样式 链接:Tabs 标签页 | Element Plus 基础: 选…...
制作一款打飞机游戏23:编辑器ui
今天,我想重点介绍编辑器的实际用户界面(UI)。 关于Excel的讨论 很多人使用Excel来编辑他们程序的数据,因为大多数时候它都能很好地完成工作。Excel就像是一把瑞士军刀,可以修改各种数据。但是,在某些情况…...
课程9. 机器翻译,Seq2Seq与Attention
课程9. 机器翻译,Seq2Seq与Attention 机器翻译的任务. Seq2Seq 架构通过实战理解加载和预处理数据构建 Seq2Seq 模型编码器解码器Seq2Seq网络训练 Seq2Seq 架构问题注意力机制(Attention)注意选项Transformer 架构介绍——BERT 课程计划 机器…...
ASP.NET MVC 入门指南二
9. 表单处理与提交 9.1 创建表单视图 在视图文件夹下创建一个用于创建产品的视图,如 Create.cshtml: html model YourNamespace.Product{ViewBag.Title "创建产品"; }<h2>创建产品</h2>using (Html.BeginForm()) {Html.Anti…...
JavaWeb学习打卡-Day3-MyBatis相关
MyBatis 什么是MyBatis? MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 JDBC JDBC(Java DataBase Connectivity):使用Java语言操作关系型数据库的…...
浅谈AI Agent 演进之路
1、了解下 AI Agent 的定义 AI Agent(人工智能代理)简单来说是一种能够感知环境、进行决策和执行动作的智能实体。与传统的人工智能相比,AI Agent 具备独立思考和调用工具逐步完成目标的能力。 例如:当要求 AI Agent 帮助下单外…...
佳博票据和标签打印:Web网页端与打印机通信 | iOS
文章目录 引言I Web网页端与打印机通信webSDK(包含示例页)打印测试II iOS与佳博打印机通信引言 佳博工具下载ESC是票据打印指令,TSC是标签打印指令 工业打印机:佳博GP-H430F工业机标签条码打印机物流快递电子面单条码机碳带机 应用场景:打印商品价格标签、打印交易小票 I…...
视频噪点多,如何去除画面噪点?
你是否遇到过这样的困扰?辛辛苦苦拍摄的视频,导出后却满屏 “雪花”,夜景变 “噪点盛宴”,低光环境秒变 “马赛克现场”? 无论是日常拍摄的vlog、珍贵的家庭录像,还是专业制作的影视作品,噪点问…...
微信小程序直传阿里云 OSS 实践指南(V4 签名 · 秒传支持 · 高性能封装)
文章目录 前言一、为什么要使用直传 OSS?二、整体架构与实现思路三、阿里云 OSS 配置(V4 签名)1. 权限设置2. 后端生成签名参数(返回给小程序) 四、微信小程序端上传流程(功能模块拆解与封装)第…...
云原生--核心组件-容器篇-1-Docker和云原生关系(Docker是云原生的基石)
1、基本概念 (1)、云原生(Cloud Native) 是一种构建和运行应用程序的方法论,旨在充分利用云计算环境(公有云、私有云、混合云)的特性,通过容器化、微服务、服务网格、声明式API等技…...
GAEA情感坐标背后的技术原理
基于GAEA的去中心化物理基础设施网络(DePIN),用户有机会在GAEA平台上获得宝贵的数据共享积分。为了提升这些洞察的丰富性,用户必须花费一定数量的积分,将过去的网络数据与当前的情感数据绑定,从而产生一种新…...
day01_编程语言介绍丶Java语言概述丶开发环境搭建丶常用DOS命令
编程语言介绍 编程语言是一种用于人与计算机之间通信的语言,允许程序员编写代码,这些代码告诉计算机要执行哪些操作。编程语言可以被视为计算机可以理解并执行的指令集合,它是一种标准化的交流技巧,用于向计算机发出指令。…...
STM32系列官方标准固件库的完整下载流程
一、官网导航与版本确认 访问ST官网 打开浏览器进入 ST官网,点击左侧 “工具与软件” 标签,展开后选择 “嵌入式软件” 。若页面未直接显示,可在搜索框输入“STM32 Standard Peripheral Libraries”查找。 → “STM32标准外设库”࿰…...
Android 14 系统统一修改app启动时图标大小和圆角
Android 14 统一修改app启动时图标大小和圆角 修改如下: 目录:frameworks/base/core/java/android/window/SplashScreenView.java frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.ja…...
MySQL 详解之函数:数据处理与计算的利器
在 MySQL 中,函数可以接受零个或多个输入参数,并返回一个值。这些函数可以在 SELECT 语句的字段列表、WHERE 子句、HAVING 子句、ORDER BY 子句以及 UPDATE 和 INSERT 语句中使用。合理利用函数,可以简化 SQL 语句,提高开发效率。 MySQL 提供了大量的内置函数 (Built-in F…...
Tailwind CSS 实战:基于 Kooboo 构建企业官网页面(一)
目录 一、技术选型:为什么选择Tailwind Kooboo? 二、CDN方案 vs 传统安装 三、CDN方式实战步骤 一、技术选型:为什么选择Tailwind Kooboo? 1.1 黄金组合优势 Tailwind CSS:原子化CSS框架,提供&#x…...
Java基础 — 条件结构与随机数
介绍 Java条件结构与随机数是程序逻辑控制的重要工具。条件结构通过if-else和switch实现分支判断:if(条件){代码}用于单分支,else if添加多条件判断,switch则基于固定值匹配不同case。随机数生成常用两种方式:Math.random()方法返…...
AI网络渗透kali应用(gptshell)
kali安装gptshell 一、shellGPT 工具介绍 ShellGPT是一款由AI大型语言模型(LLM)驱动的终端命令行工具。它能帮助用户直接在终端与AI交互,自动生成、解释、执行各类 Linux 命令,大大提升了运维和开发效率。ShellGPT 支持接入 O…...
如何实现Android屏幕和音频采集并启动RTSP服务?
技术背景 在移动直播和视频监控领域,实现高效的屏幕和音频采集并提供流媒体服务是关键技术之一。本文将详细介绍如何基于大牛直播SDK实现Android屏幕和麦克风/扬声器采集,并启动轻量级RTSP服务以对外提供拉流的RTSP URL。在Android平台上,轻…...
大模型提示词如何编写
一、提示词的核心三要素 明确目标(What) 告诉 AI「你要它做什么」,越具体越好。 ❌ 模糊:写一篇文章 ✅ 清晰:写一篇 800 字的高考作文,主题 “坚持与创新”,结构分引言、三个论点(…...
Serverless 在云原生后端的实践与演化:从函数到平台的革新
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:从服务器到“无服务器”的后端演变 在传统后端开发中,我们需要为服务配置并维护服务器资源,无论是物理机、虚拟机还是容器化服务,都需要: 管理系统运行环境 监控负载与扩缩容 保证高可用与安…...
反爬虫机制中的验证码识别:类型、技术难点与应对策略
在互联网数据抓取领域,验证码识别是爬虫过程中的关键环节之一。下面对常见验证码类型、技术难点及应对策略进行详细解析,并提供多种场景下的代码实现示例。 一、验证码类型与技术难点 (一)图形验证码 1. 字符验证码 特征&#…...
.NET 10 中的新增功能
.NET 运行时 .NET 10 运行时引入了新功能和性能改进。 关键更新包括: 数组接口方法反虚拟化:JIT 现在可以取消虚拟化和内联数组接口方法,从而提高数组枚举的性能。数组枚举去抽象化:改进功能以通过枚举器减少数组迭代的抽象开销…...
通过音频的pcm数据格式利用canvas绘制音频波形图
上面是一个完整的音频的波形图,可以大概知道音频整个的简略信息 数据准备:需要有这个音频的pcm数据,也就是时域采样值,每个数字代表某一时刻音频波形的振幅。 <!DOCTYPE html> <html lang"en"> <head&…...
Dubbo负载均衡策略深度解析
互联网大厂Java求职者面试:Dubbo负载均衡策略详解 第一轮提问: 面试官:马架构,您好!请问您了解Dubbo的负载均衡策略吗?Dubbo支持哪些负载均衡策略呢? 马架构:您好!Dub…...
【高频考点精讲】async/await原理剖析:Generator和Promise的完美结合
async/await原理剖析:Generator和Promise的完美结合 今天咱们聊聊async/await,这玩意儿用起来是真香,但你知道它背后是怎么运作的吗?其实它就是Generator和Promise的"爱情结晶"。 1. 先搞懂Generator Generator&…...
量子加密通信技术及其应用:构建无条件安全的通信网络
一、引言 在数字化时代,信息安全成为全球关注的焦点。随着量子计算技术的快速发展,传统的加密算法面临着前所未有的挑战。量子加密通信技术应运而生,它利用量子力学的基本原理,如量子叠加态和量子纠缠,实现了无条件安全…...
软考中级-软件设计师 知识点速过1(手写笔记)
第一章:数值及其转换 没什么可说的,包括二进制转八进制和十六进制 第二章:计算机内部数据表示 真值和机器数: 原码(后面都拿x 19举例) : 反码: 补码: 移码: 定点数&…...
【prompt是什么?有哪些技巧?】
Prompt(提示词)是什么? Prompt 是用户输入给AI模型(如ChatGPT、GPT-4等)的指令或问题,用于引导模型生成符合预期的回答。它的质量直接影响AI的输出效果。 Prompt 的核心技巧 1. 明确目标(Clar…...
C++进阶----多态
目录 引言1.多态的概念2.多态的定义及实现2.1 多态的构成条件2.2虚函数2.3 虚函数的重写2.4 关键字override和final2.5 重载、覆盖(重写)、隐藏对比 3.抽象类3.1 抽象类概念 4.多态的原理4.1 虚函数表4.2虚函数表的底层4.3多态的原理4.4 动态绑定和静态绑…...
银发科技:AI健康小屋如何破解老龄化困局
随着全球人口老龄化程度的不断加深,如何保障老年人的健康、提升他们的生活质量,成为了社会各界关注的焦点。 在这场应对老龄化挑战的战役中,智绅科技顺势而生,七彩喜智慧养老系统构筑居家养老安全网。 而AI健康小屋作为一项创新…...
【黑马 微服务面试篇】
分布式事务 cap定理-Availability CAP定理-Partition tolerance BASE理论 BASE理论是对CAP的一种解决思路,包含三个思想: BasicallyAvailable(基本可用):分布式系统在出现故障时,允许损失部分可用性&#…...
斗鱼娱乐电玩平台源码搭建实录
在本篇文章中,我们将以技术人的角度详细拆解一款风格接近850平台的斗鱼娱乐电玩系统源码,包含完整服务器端、前台补全资源和双端APP构建流程。基于七月最新更新内容,本教程将突出技术关键点、实战配置与代码示范,旨在为开发者和搭…...