greenUpper = (64, 255, 255)
pts = deque(maxlen=args[“buffer”])
vs = cv2.VideoCapture(0)
fps = 30 #保存视频的FPS,可以适当调整
size=(600,450)
fourcc=cv2.VideoWriter_fourcc(*‘XVID’)
videowrite=cv2.VideoWriter(‘output.avi’,fourcc,fps,size)
定义参数
–video :视频文件的路径或者摄像头的id
–buffer 是 deque 的最大大小,它维护我们正在跟踪的球的先前 (x, y) 坐标列表。 这个双端队列允许我们绘制球的“轨迹”,详细说明它过去的位置。 较小的队列将导致较短的尾部,而较大的队列将产生较长的尾部
定义hsv空间的上限和下限
启动摄像头0
最后是保存定义VideoWriter对象,实现对视频的写入功能
while True:
ret_val, frame = vs.read()
if ret_val is False:
break
frame = resize(frame, width=600)
通过高斯滤波去除掉一些高频噪声,使得重要的数据更加突出
blurred = cv2.GaussianBlur(frame, (11, 11), 0)
将图片转为HSV
hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)
inRange的作用是根据阈值进行二值化:阈值内的像素设置为白色(255),阈值外的设置为黑色(0)
mask = cv2.inRange(hsv, greenLower, greenUpper)
腐蚀(erode)和膨胀(dilate)的作用:
1. 消除噪声;
2. 分割(isolate)独立的图像元素,以及连接(join)相邻的元素;
3. 寻找图像中的明显的极大值区域或极小值区域
mask = cv2.erode(mask, None, iterations=2)
mask = cv2.dilate(mask, None, iterations=2)
开启一个循环,该循环将一直持续到 (1) 我们按下 q 键,表明我们要终止脚本或 (2) 我们的视频文件到达终点并用完帧。
读取一帧,返回两个参数,第一个参数是否成功,第二个参数是一帧图像。
如果失败则break。
对图像进行了一些预处理。首先,我们将框架的大小调整为 600 像素的宽度。缩小帧使我们能够更快地处理帧,从而提高 FPS(因为我们要处理的图像数据更少)。然后我们将模糊框架以减少高频噪声,并使我们能够专注于框架内的结构物体,例如球。最后,我们将帧转换为 HSV 颜色空间。
通过调用 cv2.inRange 处理帧中绿球的实际定位。首先为绿色提供下 HSV 颜色边界,然后是上 HSV 边界。 cv2.inRange 的输出是一个二进制掩码,
寻找轮廓,不同opencv的版本cv2.findContours返回格式有区别,所以调用了一下imutils.grab_contours做了一些兼容性处理
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = grab_contours(cnts)
center = None
only proceed if at least one contour was found
if len(cnts) > 0:
find the largest contour in the mask, then use it to compute the minimum enclosing circle
and centroid
c = max(cnts, key=cv2.contourArea)
((x, y), radius) = cv2.minEnclosingCircle©
M = cv2.moments©
对于01二值化的图像,m00即为轮廓的面积, 一下公式用于计算中心距
center = (int(M[“m10”] / M[“m00”]), int(M[“m01”] / M[“m00”]))
only proceed if the radius meets a minimum size
if radius > 10:
draw the circle and centroid on the frame, then update the list of tracked points
cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2)
cv2.circle(frame, center, 5, (0, 0, 255), -1)
pts.appendleft(center)
for i in range(1, len(pts)):
if either of the tracked points are None, ignore them
if pts[i - 1] is None or pts[i] is None:
continue
compute the thickness of the line and draw the connecting line
thickness = int(np.sqrt(args[“buffer”] / float(i + 1)) * 2.5)
cv2.line(frame, pts[i - 1], pts[i], (0, 0, 255), thickness)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
%以上Python开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-FHgUO5R7-1711880672993)]