2017-01-24 10 views
3

Im пытается измерить расстояние между двумя объектами в видео (в пикселях), используя Python и openCV. Код, который я до сих пор находит два объекта и измеряет расстояние между двумя объектами в первом кадре, но не постоянно, поскольку объекты перемещаются в видео. Im совершенно новый и для 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 (рамки) внутри цикла, например – Soltius

ответ

1

Вы должны 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

@ Сольций чудесно работал !! –