天天看点

Python OpenCV4趣味应用系列(五)---运动物体轨迹绘制

​​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)       

那么你将会看到这样的结果:

Python OpenCV4趣味应用系列(五)---运动物体轨迹绘制

也许这样你会觉得挺乱,那么我们每次只保留最近的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)      

那么你将会看到这样的结果: