У меня сейчас есть программа, которая находит центр тяжести руки. От этой центральной точки к углам кадра рисуются 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()