陶涛
学号: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
效果如下图所示