Python OpenCV4趣味应用系列(四)---颜色物体实时检测 已经介绍了如何实时检测颜色物体,并用矩形框和文字标注结果,本文将在上文的基础上来介绍如何绘制运动物体的运动轨迹。
上一篇文章我们可以获得每一帧图像中红色和蓝色物体的中心,中心坐标center = ( int(x+w/2), int(y+h/2) ),那么我们只需要将上一次和这一次的中心点坐标连起来即可,为了看起来是一个连贯的形式,我们需要先用一个列表来存储所有的中心点。
# 红色和绿色中心点列表
red_move_path_list = []
green_move_path_list = []
然后每次检测到颜色物体后将对应的中心点添加到List中。
for cnt in contours:
(x, y, w, h) = cv2.boundingRect(cnt)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
cv2.putText(frame, "green", (x, y - 5), font, 0.7, (0, 255, 0), 2)
green_move_path_list.append((int(x+w/2), int(y+h/2)))
for cnt2 in contours2:
(x2, y2, w2, h2) = cv2.boundingRect(cnt2)
cv2.rectangle(frame, (x2, y2), (x2 + w2, y2 + h2), (0, 255, 255), 2)
cv2.putText(frame, "red", (x2, y2 - 5), font, 0.7, (0, 0, 255), 2)
red_move_path_list.append((int(x2+w2/2), int(y2+h2/2)))
red_move_path_list 和
green_move_path_list中的点,代码如下(注意最少2个点才能连线):
if len(green_move_path_list)>2:
for i in range(len(green_move_path_list)-1):
cv2.line(frame, green_move_path_list[i], green_move_path_list[i+1], (0, 255, 0), 1, cv2.LINE_AA)
if len(red_move_path_list)>2:
for i in range(len(red_move_path_list)-1):
cv2.line(frame, red_move_path_list[i], red_move_path_list[i+1], (0, 0, 255), 1, cv2.LINE_AA)
那么你将会看到这样的结果:
也许这样你会觉得挺乱,那么我们每次只保留最近的15个点相连,前面的轨迹会自动消失,代码如下:
if len(green_move_path_list)>2 and len(green_move_path_list)<15:
for i in range(len(green_move_path_list)-1):
cv2.line(frame, green_move_path_list[i], green_move_path_list[i+1], (0, 255, 0), 2, cv2.LINE_AA)
elif len(green_move_path_list)>15:
for i in range(len(green_move_path_list)-16,len(green_move_path_list)-1):
cv2.line(frame, green_move_path_list[i], green_move_path_list[i+1], (0, 255, 0), 2, cv2.LINE_AA)
if len(red_move_path_list)>2 and len(red_move_path_list)<15:
for i in range(len(red_move_path_list)-1):
cv2.line(frame, red_move_path_list[i], red_move_path_list[i+1], (0, 0, 255), 2, cv2.LINE_AA)
elif len(red_move_path_list)>15:
for i in range(len(red_move_path_list)-16, len(red_move_path_list)-1):
cv2.line(frame, red_move_path_list[i], red_move_path_list[i+1], (0, 0, 255), 2, cv2.LINE_AA)
那么你将会看到这样的结果: