2017-01-24 534 views
3

我試圖用Python和openCV來測量視頻中兩個對象之間的距離(以像素爲單位)。我到目前爲止的代碼找到了兩個對象,並測量了第一幀中兩個對象之間的距離,但並不是隨着對象在視頻中移動而持續。我對OpenCV和Python都很新,所以任何幫助都非常感謝。測量視頻中兩個輪廓之間的距離? OpenCV Python

import numpy as np 
import cv2 
import matplotlib.pyplot as plt 

cap = cv2.VideoCapture('new4.avi') 
centers=[] 

while(True): 

    ret, frame = cap.read() 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    _, thresh = cv2.threshold(gray, 127,255,0) 
    im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE, 
           cv2.CHAIN_APPROX_SIMPLE) 

    for c in contours: 
     # If contours are too small or large, ignore them: 
     if cv2.contourArea(c)<100: 
      continue 
     elif cv2.contourArea(c)>2000: 
      continue 
     cv2.drawContours(frame, [c], -1, (0,255,0), 3) 

     # Find center point of contours: 
     M = cv2.moments(c) 
     cX = int(M['m10'] /M['m00']) 
     cY = int(M['m01'] /M['m00']) 
     centers.append([cX,cY]) 

     # Find the distance D between the two contours: 
    if len(centers) >=2: 
     dx= centers[0][0] - centers[1][0] 
     dy = centers[0][1] - centers[1][1] 
     D = np.sqrt(dx*dx+dy*dy) 
     print(D) 

cv2.imshow('frame', frame) 
if cv2.waitKey(1) & 0xFF == ord('q'): 
    break 

cap.release() 
cv2.destroyAllWindows() 

如何隨着物體在視頻中的移動而連續獲得距離D?

+0

你有什麼問題? D在第一幀之後的幀值是多少? – Soltius

+0

D值是295,這是第一幀中的像素距離,但當對象移動時,即使對象移近,D值也會在295處保持不變。 – agrom

+0

我從來沒有使用過視頻,所以我不知道cap.read()是如何工作的,但我認爲每次while循環都會讀取下一幀?你檢查了嗎?通過移動循環內的imshow(frame),例如 – Soltius

回答

1

你應該在while循環delcare

center=[] 

,否則你行

centers.append([cX,cY]) 

不斷從上一幀追加到中心和

dx= centers[0][0] - centers[1][0] 
dy = centers[0][1] - centers[1][1] 

始終以中心從第一個框架,這是從來沒有被取代。

這整個

if len(centers) >=2: 

的事情其實並不多,你應該檢查精確的平等反正給你的應用程序,因爲如果你有2周以上的輪廓,哪有不去的道理,你想只有第2 findContours決定給你。

+0

啊哈,解決了它!非常感謝你:) – agrom

+0

@Soltius奇妙的工作! –