物体追踪实战:使用 OpenCV实现对指定颜色的物体追踪,Python工程师面试题目和答案

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 的输出是一个二进制掩码,

image-20211217152000441

寻找轮廓,不同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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

%以上Python开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-FHgUO5R7-1711880672993)]

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值