美文网首页嵌牛IT观察
使用混合高斯模型的背景提取算法,对视频中运动的物体进行标记

使用混合高斯模型的背景提取算法,对视频中运动的物体进行标记

作者: 陶_306c | 来源:发表于2019-11-28 21:09 被阅读0次

陶涛

学号:19131213373

【嵌牛导读】使用python编程运动分析,对运动物体进行标记

【嵌牛鼻子】Mac, python3.7, opencv

【嵌牛正文】

程序实现的功能是对视频中的运动物体进行轮廓绘制,找出外接矩形,并对运动物体进行标号,最终在命令窗口显示参数。

import cv2

# 加载视频

cap = cv2.VideoCapture()

cap.open('/Users/taotao/Desktop/vtest.avi')

if not cap.isOpened():#检查是否成功初始化

    print("无法打开视频文件")

pBgModel = cv2.createBackgroundSubtractorMOG2()#构造高斯混合模型

def labelTargets(img, mask, threshold):

    seg = mask.copy()#复制二值图

    cnts = cv2.findContours(seg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#找出图片的轮廓,对其进行循环

    count = 0

    for i in cnts[1]:

        area = cv2.contourArea(i)

        if area < threshold:

            continue

        count += 1

        rect = cv2.boundingRect(i)#外接矩形

        print("矩形:X:{} Y:{} 宽:{} 高:{}".format(rect[0], rect[1], rect[2], rect[3]))

        cv2.drawContours(img, [i], -1, (255, 255, 0), 1)#画出轮廓

        cv2.rectangle(img, (rect[0], rect[1]), (rect[0] + rect[2], rect[1] + rect[3]), (0, 0, 255), 1)#画出外接矩阵

        cv2.putText(img, str(count), (rect[0], rect[1]), cv2.FONT_HERSHEY_PLAIN, 0.5, (0, 255, 0), 1)

    return count

while True:

    flag, source = cap.read()# 从视频中读取文件

    if not flag:

        break

    image = cv2.pyrDown(source)

    fgMask = pBgModel.apply(image)#使用上混合高斯模型

    #kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))#定义矩形

    #morphImage_open = cv2.morphologyEx(fgMask, cv2.MORPH_OPEN, kernel, iterations=5)#使用开运算进行噪音的去除

    #mask = fgMask - morphImage_open#mask显示的图像有灰点,不是黑白图

    _, Mask = cv2.threshold(fgMask, 30, 255, cv2.THRESH_BINARY) # + cv2.THRESH_OTSU

    # Mask = cv2.GaussianBlur(Mask, (5, 5), 0)

    targets = labelTargets(image, Mask, 30)

    print("共检测%s个目标" % targets)

    backGround = pBgModel.getBackgroundImage()

    #foreGround = image - backGround

    cv2.imshow('source', image)#展示图片,

    cv2.imshow('background', backGround)

    cv2.imshow('foreground', Mask)

    key = cv2.waitKey(50)#延长放映时间,设置太低视频播放的很快,设置太高视频播放的很慢,通常25ms就可以

    if key == 27:#esc的意思

        break

效果如下图所示

相关文章

网友评论

    本文标题:使用混合高斯模型的背景提取算法,对视频中运动的物体进行标记

    本文链接:https://www.haomeiwen.com/subject/oxsiwctx.html