陶濤
學(xué)號:19131213373
【嵌牛導(dǎo)讀】使用python編程運(yùn)動分析,對運(yùn)動物體進(jìn)行標(biāo)記
【嵌牛鼻子】Mac帖努, python3.7, opencv
【嵌牛正文】
程序?qū)崿F(xiàn)的功能是對視頻中的運(yùn)動物體進(jìn)行輪廓繪制棠众,找出外接矩形琳疏,并對運(yùn)動物體進(jìn)行標(biāo)號,最終在命令窗口顯示參數(shù)闸拿。
import cv2
# 加載視頻
cap = cv2.VideoCapture()
cap.open('/Users/taotao/Desktop/vtest.avi')
if not cap.isOpened():#檢查是否成功初始化
? ? print("無法打開視頻文件")
pBgModel = cv2.createBackgroundSubtractorMOG2()#構(gòu)造高斯混合模型
def labelTargets(img, mask, threshold):
? ? seg = mask.copy()#復(fù)制二值圖
? ? cnts = cv2.findContours(seg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#找出圖片的輪廓空盼,對其進(jìn)行循環(huán)
? ? 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)#使用開運(yùn)算進(jìn)行噪音的去除
? ? #mask = fgMask - morphImage_open#mask顯示的圖像有灰點(diǎn),不是黑白圖
? ? _, 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個目標(biāo)" % targets)
? ? backGround = pBgModel.getBackgroundImage()
? ? #foreGround = image - backGround
? ? cv2.imshow('source', image)#展示圖片新荤,
? ? cv2.imshow('background', backGround)
? ? cv2.imshow('foreground', Mask)
? ? key = cv2.waitKey(50)#延長放映時間揽趾,設(shè)置太低視頻播放的很快,設(shè)置太高視頻播放的很慢苛骨,通常25ms就可以
? ? if key == 27:#esc的意思
? ? ? ? break
效果如下圖所示