天天看點

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)      

那麼你将會看到這樣的結果: