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=100detectShadows=True
动态背景(如树叶、水流)KNN、ViBeK=50radius=20(ViBe)
实时性优先(嵌入式设备)ViBe、简化 MOG2history=200varThreshold=25
复杂光照变化CNT、MOG2detectShadows=True, 低学习率(0.001)
多模态背景(周期性运动)GMM(K=3~5)增加高斯分布数量,动态调整背景比例阈值

 背景建模是视频分析的基石,其核心价值在于平衡模型鲁棒性与计算效率。通过理解不同算法的适用场景、参数含义及后处理技巧,结合具体硬件条件和场景需求,可实现精准的前景提取,为上层计算机视觉任务奠定坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小重构,大收益!技术重构实践:如何优雅升级老旧接口

重构格言&#xff1a;"优秀系统不是设计出来的&#xff0c;而是通过持续重构演进而来的。" —— Martin Fowler《重构&#xff1a;改善既有代码的设计》 希望本文能为您的重构之旅提供指引&#xff0c;让老旧系统焕发新生&#xff01; 一、背景&#xff1a;一个“稳定…

OSPF中DR/BDR的选举

OSPF 开放式最短路径优先协议-CSDN博客 选举原因&#xff1a;广播网络中使路由信息交换更加高速有序&#xff0c;可以降低需要维护的邻接关系数量 基本概念&#xff1a; DR (Designated Router, 指定路由器)&#xff1a;负责在广播网络&#xff08;以太网&#xff09;或NBMA网…

[特殊字符]‍[特殊字符]Linux驱动开发入门 | 并发与互斥机制详解

文章目录 &#x1f468;‍&#x1f4bb;Linux驱动开发入门 | 并发与互斥机制详解&#x1f4cc;为什么驱动中需要并发和互斥控制&#xff1f;&#x1f4a1;常见的并发控制机制&#x1f510;自旋锁和信号量通俗理解&#x1f300;自旋锁&#xff08;Spinlock&#xff09;——“厕所…

Kafka 架构设计和组件介绍

什么是Apache Kafka&#xff1f; Apache Kafka 是一个强大的开源分布式事件流平台。它最初由 LinkedIn 开发&#xff0c;最初是一个消息队列&#xff0c;后来发展成为处理各种场景数据流的工具。 Kafka 的分布式系统架构支持水平扩展&#xff0c;使消费者能够按照自己的节奏检…

elk中kibana一直处于可用和降级之间且es群集状态并没有问题的解决方法

前言 在公司部elk的时候发现kibana的web界面一直很卡&#xff0c;数据量为0也会很卡&#xff0c;es群集状态正常&#xff0c;资源足够。 报错信息 [2025-03-17T09:54:50.19400:00][INFO ][status] Kibana is now available (was degraded) [2025-03-17T09:55:03.28000:00][I…

什么是视频上墙

视频联动上墙是指当监控系统中出现报警或其他特定事件时&#xff0c;相关的视频画面能够自动切换并显示在指定的监控大屏或显示设备上&#xff0c;以便监控人员能够快速、直观地查看事件现场的情况&#xff0c;及时做出响应和处理。 具体介绍• 系统组成 &#xff1a;一般由前端…

26考研——存储系统(3)

408答疑 文章目录 一、存储器概述二、主存储器三、主存储器与 CPU 的连接四、外部存储器五、高速缓冲存储器六、虚拟存储器七、参考资料鲍鱼科技课件26王道考研书 八、总结复习提示思考题常见问题和易混淆知识点 一、存储器概述 文章链接: 点击跳转 二、主存储器 文章链接: …

.NET 6 + Dapper + User-Defined Table Type

大家都知道&#xff0c;对于SQL Server IN是有限制条件的&#xff0c;如果IN里面的内容过多&#xff0c;在执行的时候会被自动截断&#xff0c;因而导致查询到的结果不是实际需要的结果。 select * from Payments where Id in (1,2,3,4,...) 为了解决上面的限制&#xff0c;可以…

MySQL 8(Ubuntu 18.04.6 LTS)安装笔记

一、前言 其实之前已经写过一篇笔记【MySQL 8.0.34&#xff08;x64&#xff09;安装笔记】。机缘巧合&#xff0c;这次遇到的环境是Ubuntu 18.04 LTS&#xff0c;相比Windows平台的安装&#xff0c;对mysql的版本以及依赖的选择&#xff0c;稍微要窄一些。特作笔记。 二、准备…

学习 Apache Kafka

学习 Apache Kafka 是一个很好的选择&#xff0c;尤其是在实时数据流处理和大数据领域。以下是一个系统化的学习建议&#xff0c;帮助你从入门到进阶掌握 Kafka&#xff1a; 1. 先决条件 在开始 Kafka 之前&#xff0c;确保你具备以下基础&#xff1a; Java 基础&#xff1a;K…

使用 binlog2sql 闪回 MySQL8 数据

【说明】 MySQL服务器版本 8.0.26 mysql> SELECT version(); ----------- | version() | ----------- | 8.0.26 | -----------Python 版本 Python 3.8.10 [infuq ~]# python -V Python 3.8.10【安装】 binlog2sql 官方地址 1.安装 binlog2sql [infuq ~]# git clone …

JavaScript 异步编程与请求取消全指南

JavaScript 异步编程与请求取消全指南 涵盖&#xff1a;同步/异步、Promise、async/await、AbortController、前后端协作 一、同步与异步 1. 同步&#xff08;Synchronous&#xff09; 定义&#xff1a;代码按顺序执行&#xff0c;前一步完成才能执行下一步。特点&#xff1…

永久缓存 Git 凭证

永久缓存 Git 凭证 打开终端或命令行工具。 执行以下命令&#xff0c;设置 Git 使用 store 凭证帮助程序&#xff1a; bash git config --global credential.helper store第一次执行 git pull 时输入账号密码。之后&#xff0c;所有需要凭证的操作都将自动使用存储的凭证&…

力扣-48.旋转图像

题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 class Solution { public:void rotate(vector<vector<int>…

Qt ModbusSlave多线程实践总结

最近项目中用到了ModbusSlave&#xff0c;也就是Modbus从设备的功能&#xff0c;之前用的基本都是master设备&#xff0c;所以读取数据啥的用单线程就行了&#xff0c;用 void WaitHelper::WaitImplByEventloop(int msec) {QEventLoop loop;QTimer::singleShot(msec, &loop…

opencv--图像

像素(像素点) 定义&#xff1a; Pixel 是 Picture Element&#xff08;图像元素&#xff09;的缩写&#xff0c;是数字图像中最小的独立单位。每个像素代表图像中的一个点的颜色和亮度信息。 关键特性&#xff1a; 颜色&#xff1a;通过不同的色彩模型&#xff08;如RGB、CMYK…

记录学习汇编语言02+各种寄存器分类

8086cpu是十六位的 然后寄存器能存八位 所以分为高八位低八位 高八位在下面低八位在上面 从下往上读&#xff08;从地址小的地方开始读&#xff09; 8086cpu种有两个和栈相关的寄存器 栈段寄存器ss&#xff08;栈顶的段寄存器&#xff09; 栈顶指针寄存器sp&#xff08;…

OpenCV 图形API(53)颜色空间转换-----将 RGB 图像转换为灰度图像函数RGB2Gray()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 RGB 色彩空间转换为灰度。 R、G 和 B 通道值的常规范围是 0 到 255。生成的灰度值计算方式如下&#xff1a; dst ( I ) 0.299 ∗ src…

(51单片机)LCD显示数据存储(DS1302时钟模块教学)(LCD1602教程)(独立按键教程)(延时函数教程)(I2C总线认识)(AT24C02认识)

目录 演示视频&#xff1a; 源代码 main.c LCD1602.c LCD1602.h AT24C02.c AT24C02.h Key.c Key.h I2C.c I2C.h Delay.c Delay.h 代码解析与教程&#xff1a; Dealy模块 LCD1602模块 Key模块 I2C总线模块 AT24C02模块 /E2PROM模块 main模块 演示视频&#xff1a; E2…

电子病历高质量语料库构建方法与架构项目(数据遗忘篇)

引言 在人工智能与医疗健康的深度融合时代,医疗数据的价值与风险并存。跨机构和平台的医疗数据共享对于推动医学研究、提高诊断精度和实现个性化治疗至关重要,但同时也带来了前所未有的隐私挑战。先进的AI技术可以从理论上去标识化的医疗扫描中重新识别个人身份,例如从MRI数…