Я новичок в обработке изображений. Я хочу обнаружить движение глаз с веб-камеры, используя openCV в python. Я использую этот фрагмент кода для обнаружения правого глаза:
eye_cascade = cv2.CascadeClassifier('haarcascade_righteye_2splits.xml')
eyes = eye_cascade.detectMultiScale(gray, minSize=(30, 30))
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(frame, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
print(str(ex)+'b'+str(ey))
print("Sent\n")
Он отображает пиксели моего правого глаза в режиме реального времени, вот так:
.
.
.
260b216
Sent
261b219
Sent
.
.
.
Я вижу, как значения пикселей меняются, когда я перемещаю глаза, но я хочу, чтобы python вычислял расстояние между двумя последовательными значениями пикселей: sqrt((261-260)^2 + (219-216)^2) и отображал это значение как вывод, в режиме реального времени. Какие функции numpy/math/other мне нужно использовать для достижения этого?
Вы хотите вычислить евклидово расстояние между двумя последовательными кадрами. (источник)
Вы можете инициализировать счетчик cnt
для подсчета двух последовательных кадров. Каждый раз, когда вы получаете (ex, ey, ew, eh)
, увеличивайте cnt
на единицу. Если вы получаете два последовательных кадра, рассчитайте расстояние между ними и распечатайте.
Для расчета расстояния нужно сохранить предыдущие координаты (exy_prv
) и текущие (exy_cur
)
Вот пример кода:
import numpy as np
eyes = [[260, 216, 260 + 50, 216 + 50],
[261, 219, 261 + 50, 219 + 50],
[262, 222, 262 + 50, 222 + 50],
[263, 224, 263 + 50, 224 + 50]]
cnt = 1
exy_prv = []
dist = None
for (ex, ey, ew, eh) in eyes:
if cnt % 2 == 0:
exy_cur = np.array((ex, ey))
dist = np.linalg.norm(exy_cur - exy_prv)
cnt = 1
exy_cur = exy_prv
# cv2.rectangle(frame, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
print(str(ex)+'b'+str(ey))
print("Sent\n")
if dist is not None:
print("distance: {}\n".format(dist))
exy_prv = np.array((ex, ey))
cnt += 1
Результат
260b216
Sent
261b219
Sent
3.1622776601683795
262b222
Sent
3.1622776601683795
263b224
Sent
2.23606797749979
Вы можете использовать math.hypot() stackoverflow.com/questions/5228383/…