机器学习:opencv--背景建模

目录

一、背景建模是什么?

二、背景建模的目的

三、背景建模的方法及原理

四、代码实现

1.创建卷积核

2.创建混合高斯模型

3.处理图像

4.绘制人形轮廓

5.条件退出


一、背景建模是什么?

  • 指在计算机视觉中,从视频序列中提取出静态背景的一种技术。
  • 在视频中,背景通常被定义为相对稳定的部分,例如墙壁、地面或天空等。
  • 背景建模的目标是将动态的前景对象与静态的背景进行分离,以便进一步分析和处理。

二、背景建模的目的

  • 运动检测:识别并提取视频中的运动对象。
  • 场景理解:帮助计算机理解视频中的不同场景和物体。
  • 事件检测:监测特定事件或行为,如入侵检测、交通监控等。

三、背景建模的方法及原理

  1. 帧差法
    1. 将当前帧与上一帧进行逐像素比较。
    2. 计算每个像素的差值,并将差值大于设定阈值的像素标记为前景。
    3. 生成二值图像,白色区域表示检测到的运动对象,黑色区域表示背景。
  2. 基于K近邻的背景/前景分割算法
    1. 每个像素维护一个K个历史颜色值的队列。
    2. 对于当前帧中每个像素,将其与历史颜色值进行比较,计算相似度。
    3. 如果当前像素与大多数历史颜色值相似,则认为该像素属于背景;否则,标记为前景。
    4. 采用自适应的阈值来判断像素是否为前景。
  3. 基于高斯混合的背景/前景分割算法:
    1. 每个像素用多个高斯分布进行建模,形成高斯混合模型。
    2. 对于每个像素,根据当前输入值与模型中每个高斯分布的相似度进行匹配。
    3. 若当前值与某个高斯分布相似,则更新该分布的均值和方差;否则,引入新的高斯分布。
    4. 通过设定阈值确定哪些像素被视为前景。

四、代码实现

1.创建卷积核

python 复制代码
import cv2

# 经典的测试视频
cap = cv2.VideoCapture('test.avi')
# getstructuringElement(shape,ksize,anchor=None)得到一个卷积核。主要用于后续的腐蚀、膨胀、开、闭等运算。
# 参数:shape:设定卷积核的形状,可选如下三个参数:
#           1、MORPH_RECT(矩形卷积核)
#           2、MORPH_CROSS(十字形卷积核)
#           3、MORPH ELLIPSE(椭圆形卷积核)
#   ksize:设定要获取的卷积核的大小
#   anchor:表示描点的位置:一般c=1,表不描点位于中心
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))

2.创建混合高斯模型

python 复制代码
# 创建混合高斯模型,用于背景建模
fgbg = cv2.createBackgroundSubtractorMOG2()

3.处理图像

  1. 遍历视频的每一帧,
  2. 将每一帧进行背景建模处理
  3. 将背景建模之后的图像进行形态学处理,这里进行开运算去除噪点
python 复制代码
while True:
    ret, frame = cap.read()  # ret:True表示正常读取到图像,frame:从视频中获取当前一帧图片
    cv2.imshow('frame', frame)
    fgmask = fgbg.apply(frame)  # 视频处理
    cv2.imshow('fgmask', fgmask)
    fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)  # 开运算去噪点,先腐蚀后膨胀。
    cv2.imshow('fgmask_new', fgmask_new)

4.绘制人形轮廓

  1. 将上述得到的图像进行查找轮廓
  2. 计算各轮廓的周长,判断属于人的轮廓
  3. 将其在图像上绘制出来
  4. 然后显示出来
  5. 最终得到每一帧的在动的人的轮廓,实现了人形检测
python 复制代码
    # 寻找视频中的轮廓
    _, contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        # 计算各轮廓的周长
        perimeter = cv2.arcLength(c, True)
        if perimeter > 115:  # 判断是否为行走的人
            # 找到一个直矩形(不会旋转)
            x, y, w, h = cv2.boundingRect(c)
            # 画出这个矩形
            fgmask_new_rect = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    cv2.imshow('fgmask_new_rect', fgmask_new_rect)

5.条件退出

  1. 每一帧图像显示60毫秒,
  2. 如果键盘按下esc键则退出循环
python 复制代码
    k = cv2.waitKey(60)
    if k == 27:  # esc 的ascii码值
        break

输出:

相关推荐
政安晨1 小时前
政安晨【零基础玩转开源AI项目】- AutoGPT:全球首个自主AI Agent从入门到实战(致敬OpenClaw的小回顾)
人工智能·ai·autogpt·全球首个agent框架·致敬openclaw之作·参考价值·ai开源agent框架
Shawn_Shawn5 小时前
mcp学习笔记(一)-mcp核心概念梳理
人工智能·llm·mcp
冷雨夜中漫步7 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
33三 三like7 小时前
《基于知识图谱和智能推荐的养老志愿服务系统》开发日志
人工智能·知识图谱
芝士爱知识a7 小时前
【工具推荐】2026公考App横向评测:粉笔、华图与智蛙面试App功能对比
人工智能·软件推荐·ai教育·结构化面试·公考app·智蛙面试app·公考上岸
腾讯云开发者8 小时前
港科大熊辉|AI时代的职场新坐标——为什么你应该去“数据稀疏“的地方?
人工智能
工程师老罗9 小时前
YoloV1数据集格式转换,VOC XML→YOLOv1张量
xml·人工智能·yolo
Coder_Boy_9 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
Gain_chance9 小时前
34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总
数据仓库·hive·笔记·学习·datagrip