【python】OpenCV—Tracking(10.2)

文章目录

BackgroundSubtractor

Opencv 有三种背景分割器

  • K-Nearest:KNN

  • Mixture of Gaussian(MOG2)

  • Geometric Multigid(GMG)

借助 BackgroundSubtractor 类,可检测阴影,用阈值排除阴影,从而关注实际特征

createBackgroundSubtractorMOG2

OpenCV图像处理- 视频背景消除与前景ROI提取

API:

cv2.createBackgroundSubtractorMOG2(

int history = 500,

double varThreshold = 16,

bool detectShadows = true

)

参数解释如下:

  • history表示过往帧数,500帧,选择history = 1就变成两帧差
  • varThreshold表示像素与模型之间的马氏距离,值越大,只有那些最新的像素会被归到前景,值越小前景对光照越敏感。
  • detectShadows 是否保留阴影检测,请选择False这样速度快点。
py 复制代码
import cv2
import os
# bs = cv2.createBackgroundSubtractorKNN(detectShadows=True)
bs = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
os.makedirs("frame1", exist_ok=True)
os.makedirs("frame2", exist_ok=True)
os.makedirs("frame3", exist_ok=True)

camera = cv2.VideoCapture('car.mkv')
index = 0
while True:
    ret, frame = camera.read()
    index += 1
    frame_h, frame_w, _ = frame.shape
    fgmask = bs.apply(frame)
    th = cv2.threshold(fgmask.copy(), 244, 255, cv2.THRESH_BINARY)[1]
    dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)),
                         iterations=2)
    contours, _ = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for c in contours:
        # if cv2.contourArea(c) > frame_w*0.075 * frame_h*0.075:
        if cv2.contourArea(c) > 1000:
            (x, y, w, h) = cv2.boundingRect(c)
            cv2.rectangle(frame, (x,y), (x+w, y+h), (0, 0, 255), 5)
    cv2.imshow("mog", fgmask)
    cv2.imwrite("./frame1/{}.jpg".format(index), fgmask)
    cv2.imshow("thresh", th)
    cv2.imwrite("./frame2/{}.jpg".format(index), th)
    cv2.imshow("detection", frame)
    cv2.imwrite("./frame3/{}.jpg".format(index), frame)

    if cv2.waitKey(30) & 0xff == ord("q"):
        break

camera.release()
cv2.destroyAllWindows()

做 gif 的时候只设置了播放一次,重复播放需要刷新

createBackgroundSubtractorKNN

py 复制代码
import cv2
import numpy as np
bs = cv2.createBackgroundSubtractorKNN(detectShadows=True)
camera = cv2.VideoCapture('car.mkv')
index = 0
while True:
    ret, frame = camera.read()
    index += 1
    frame_h, frame_w, _ = frame.shape
    fgmask = bs.apply(frame)
    th = cv2.threshold(fgmask.copy(), 244, 255, cv2.THRESH_BINARY)[1]
    dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)),
                         iterations=2)
    contours, _ = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for c in contours:
        # if cv2.contourArea(c) > frame_w*0.075 * frame_h*0.075:
        if cv2.contourArea(c) > 1000:
            (x, y, w, h) = cv2.boundingRect(c)
            cv2.rectangle(frame, (x,y), (x+w, y+h), (0, 0, 255), 5)
    cv2.imshow("mog", fgmask)
    cv2.imwrite("./frame1/{}.jpg".format(index), fgmask)
    cv2.imshow("thresh", th)
    cv2.imwrite("./frame2/{}.jpg".format(index), th)
    cv2.imshow("detection", frame)
    cv2.imwrite("./frame3/{}.jpg".format(index), frame)

    if cv2.waitKey(30) & 0xff == ord("q"):
        break

camera.release()
cv2.destroyAllWindows()
相关推荐
装不满的克莱因瓶10 分钟前
【SpringAI Alibaba】ReactAgent结构化输出OutputType与OutputSchema实战
java·人工智能·ai·springai·springaialibaba
楚山之石20 分钟前
【Radiology】影像组学的标准化与可重复性:IBSI 卷积滤波器共识及其未能覆盖的环节
人工智能·学习·机器学习·mri
东姬AI26 分钟前
挖出948个内核漏洞、自动写补丁:GPT-6 Cyber把AI推进“实战岗“,内容行业还卡在哪一关?
人工智能·网络安全·openai·gpt-6
用户29914221968033 分钟前
GitHub 热榜项目:日榜(2026-11-10)
人工智能·开源·github
用户29914221968039 分钟前
AI 日报(2026年11月10日)
人工智能
QXWZ_IA1 小时前
定位数据怎么推给 IoT 平台?消息协议选型与接入准备
网络·人工智能·物联网·安全
java_logo1 小时前
Docker 部署 ReMe:轻松搭建 AI Agent 记忆管理平台
人工智能·docker·容器·ai agent·轩辕镜像·reme·agentscope-ai
合尘猫1 小时前
图片表格变结构化数据:OCR 后的三个坑
python·ocr
小小张说故事1 小时前
Python 里弱引用到底弱在哪:拆开 weakref.ref、回调陷阱和 WeakValueDictionary
python
硅谷秋水1 小时前
从VLM规划器到机器人智能体:面向依赖历史信息的操控任务自演化框架
人工智能·机器学习·语言模型·机器人