百度了一下,发现了openCV实现动态追踪的两种方法,然后下了个中文版python-openCV的文档来查看每个函数的用法,现在做出了第一种方法的识别,原理是根据阙值来跟踪,也就是遍历每一帧根据颜色来跟踪,很简单的方法,文档中的已经可以实现了,
然后修改了一下,加了个轮廓
import cv2 import numpy as np cap = cv2.VideoCapture("E:\\桌面\\video_3.mp4") result = cap.isOpened() if result is True: while True: # 获取每一帧调用camera.read()为我们返回一个2元组。 # 元组的第一个值是grabbed,表明是否成功从缓冲中读取了frame。 # 元组的第二个值就是frame它本身。 ret, image = cap.read() if ret is False: break # 转换到 HSV hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 设定黑色的阈值 lower = np.array([0, 0, 0]) upper = np.array([80, 80, 80]) # 黑色的阙值 # 腐蚀操作 mask = cv2.inRange(hsv, lower, upper) # 膨胀操作,其实先腐蚀再膨胀的效果是开运算,去除噪点 mask = cv2.erode(mask, None, iterations=2) # 膨胀操作,其实先腐蚀再膨胀的效果是开运算,去除噪点 mask = cv2.dilate(mask, None, iterations=2) cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] # 初始化瓶盖圆形轮廓质心 center = None # 如果存在轮廓 if len(cnts) > 0: # 找到面积最大的轮廓 c = max(cnts, key=cv2.contourArea) # 确定面积最大的轮廓的外接圆 ((x, y), radius) = cv2.minEnclosingCircle(c) # 计算轮廓的矩 M = cv2.moments(c) # 计算质心 center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) cv2.circle(image, (int(x), int(y)), int(radius), (0, 255, 255), 2) cv2.circle(image, center, 5, (0, 0, 255), -1) # 根据阈值构建掩模 # 对原图像和掩模进行位运算 res = cv2.bitwise_and(image, image, mask=mask) cv2.imshow('image', image) cv2.imshow('mask', mask) cv2.imshow('res', res) # cv2.waitKey(0) k = cv2.waitKey(5) & 0xff if k == 27: break cv2.destroyAllWindows() cap.release() else: print("打开失败") #引用 https://blog.csdn.net/sinat_31135199/article/details/51252393
hsv的阙值是在菜鸟工具里面查的
视频要找个简单一点的,查看mask就可以看出有哪些干扰轮廓的地方
代码里面已经有详细的注释了,中文文档真的有良心,很详细