Сравнение непрерывных пар массивов - PullRequest
0 голосов
/ 26 мая 2020

У меня сейчас есть программа, которая находит центр тяжести руки. От этой центральной точки к углам кадра рисуются 4 линии, верхний левый, верхний правый, нижний правый, нижний левый здесь . Моя общая цель - выполнить функцию, когда длина этих 4 строк не сильно изменится. До сих пор мой первый план действий состоял в том, чтобы найти расстояние от каждого угла (4) до центроида, я добился успеха, используя формулу расстояния. Я пока могу видеть, как эти данные обновляются в режиме реального времени из-за 1D-массива с 4 элементами , показанного здесь . Теперь я думаю, что способ, которым я смогу найти текущее изменение расстояний, - это вычесть более новое расстояние из предыдущего. Затем выведенная разница будет оцениваться с использованием некоторого типа порога. Мой главный вопрос заключается в том, как я могу сделать это вычитание, в котором я могу вычесть более новый массив из предыдущего.

from collections import deque
from imutils.video import VideoStream
import numpy as np
import argparse
import cv2
import imutils
import time
import math
import time, threading
import itertools

def cal_distance(center):

    upper_right_distance = math.sqrt((math.pow(center[0] - 600, 2)) + (math.pow(center[1] - 0, 2)))

    upper_left_distance = math.sqrt((math.pow(center[0] - 0, 2)) + (math.pow(center[1] - 0, 2)))

    lower_left_distance = math.sqrt((math.pow(center[0] - 0, 2)) + (math.pow(center[1] - 600, 2)))

    lower_right_distance = math.sqrt((math.pow(center[0] - 600, 2)) + (math.pow(center[1] - 600, 2)))

    distances = [upper_left_distance, upper_left_distance, lower_left_distance, lower_right_distance]

    return distances

skinLower = (0, 58, 50)
skinUpper = (30, 255, 255)
pts = deque(maxlen=2)

cap = cv2.VideoCapture(0)
while True:
    _, frame = cap.read()

    frame = frame[200 : 500, 550 : 850]

    frame = imutils.resize(frame, width=600)

    blurred = cv2.GaussianBlur(frame, (11, 11), 0)

    hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)

    mask = cv2.inRange(hsv, skinLower, skinUpper)

    mask = cv2.erode(mask, None, iterations=2)

    mask = cv2.dilate(mask, None, iterations=2)

    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    cnts = imutils.grab_contours(cnts)

    center = None

    distance = None

    if len(cnts) > 0:
    c = max(cnts, key=cv2.contourArea)
    ((x, y), radius) = cv2.minEnclosingCircle(c)
    M = cv2.moments(c)
    center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))

    if radius > 10:
        cv2.circle(frame, (int(x), int(y)), int(radius), (255, 255, 255), 2)
        cv2.circle(frame, center, 5, (255, 0, 255), -1)
        cv2.line(frame, center, (0, 0), (255, 0, 255), 3)
        cv2.line(frame, center, (600, 0), (255, 0, 255), 3)
        cv2.line(frame, center, (0, 600), (255, 0, 255), 3)
        cv2.line(frame, center, (600, 600), (255, 0, 255), 3)

        distance = cal_distance(center)

        print("updated distance")

        print(distance)

     cv2.imshow('thing', mask)

     cv2.imshow('Original', frame)

     key = cv2.waitKey(1)

     if key == 27:
         break

cap.release()
cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 26 мая 2020

Вы можете выполнить задачу, выполнив следующие шаги:

1) Установите логический флаг или любую переменную, которая проверяет погоду в первом кадре (независимо от того, вычисляются ли расстояния впервые или нет)

2) если первый раз, то перейти к шагу 3 иначе go к шагу 4

3) Прочитать текущий кадр-> найти расстояния-> сохранить в массиве с именем (например) "prevDistances" "-> обновить логический флаг -> break.

4) Прочитать текущий кадр -> найти расстояния -> сохранить в массиве с именем (например) currDistances -> перейти к шагу 5.

5) Теперь вы можете сравнивать массивы расстояний (соответствующие каждому элементу в массиве, например, prevDistances [1] -currDistances [1], .... и проверять их с соответствующими пороговыми значениями). Если сравнение / вычитание пересекает пороговые значения, вы можете продолжить желаемую функциональность.

...