Вычисление расстояния между пикселями в реальном времени в python

Я новичок в обработке изображений. Я хочу обнаружить движение глаз с веб-камеры, используя 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 мне нужно использовать для достижения этого?

Вы можете использовать math.hypot() stackoverflow.com/questions/5228383/…

Divyank Saxena 13.12.2020 14:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
513
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите вычислить евклидово расстояние между двумя последовательными кадрами. (источник)

Вы можете инициализировать счетчик 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

Другие вопросы по теме