Цель состоит в том, чтобы найти контуры , которые больше 170 в размере области контура , которые продолжают расти в течение 5 кадров.
Я могу сделать это для один контур . Мой метод такой, как для новичка, так как в настоящее время я добавляю значения центра отфильтрованных контуров в деку, а соответствующие значения области контура - в отдельную деку. Если после 5 кадров значения последовательно увеличиваются, я вытаскиваю первое значение из очереди (указывающее начальную позицию роста).
ключ вопросявляется: - Как я могу отслеживать два или три контура для последовательный рост контуров ?
Дополнительные вопросы:
-В настоящее время я предполагаю, что рост будет происходить от первого отфильтрованного контура , это будет , а не всегда так, может начаться рост контура происходит в позициях 10,11,12,13,14 - тогда мне нужно будет взять значение координаты позиции 10 в координатной деке - как мне сравнить последовательные области контура для проверкидля 5 кадров последовательного роста при отслеживании начальных координат роста ?
- есть более эффективный способ обработки значений центральной и контурной областей, чем добавление боth по запросу после прохождения порога области контура?
coords = deque()
cGrowth = deque()
dim = (1280, 720)
firstFrame = None
j = 0
# loop over the frames of the video
while True:
frame = cv2.VideoCapture(pathToVideo)
if frame is None:
break
frame = cv2.resize(frame, dim, interpolation = cv2.INTER_AREA)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
if firstFrame is None:
firstFrame = gray
continue
frameDelta = cv2.absdiff(firstFrame, gray)
thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.dilate(thresh, None, iterations=2)
contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
centres = []
cAreas = []
center = None
for i in range(len(contours)):
if cv2.contourArea(contours[i]) < 150:
continue
moments = cv2.moments(contours[i])
cAreas.append(cv2.contourArea(contours[i]))
centres.append((int(moments['m10']/moments['m00']), int(moments['m01']/moments['m00'])))
cv2.circle(frame, centres[-1], 3, (0,0,0), -1)
coords.append(centres)
cGrowth.append(cAreas)
if len(cGrowth) == 5:
i = 0
for x, y in pairwise(cGrowth):
#print(x, y)
if (x < y):
i += 1
if (i == 4):
impX = coords.popleft()
print("Origin of motion is at: " + str(impX))
break
break
j += 1
cv2.imshow("Motion Feed", frame)
cv2.imshow("Thresh", thresh)
cv2.imshow("Frame Delta", frameDelta)
key = cv2.waitKey(1) & 0xFF
# if the 'q' key is pressed, destroy all windows
if key == ord("q"):
cv2.destroyAllWindows()