Я использую обнаружение объектов глубокого обучения для отслеживания одного человека в пространстве с помощью OpenCV, SingleShot Detector и MobileNets.Я пишу на Python.Мне нужно рассчитать угол, пройденный, когда человек перемещается из одной позиции в другую.
Я написал алгоритм, который сначала вычисляет центр тяжести обнаруженного человека, используя размеры ограничительной рамки.Далее он вычисляет расстояние до человека по формуле, полученной с помощью регрессии.После этого сгенерированные значения сравниваются с предыдущими значениями и рассчитываются их горизонтальные расстояния.Поэтому для каждого экземпляра текущее расстояние, предыдущее расстояние и горизонтальное расстояние между ними образуют треугольник с известными сторонами.Следовательно, можно вычислить пройденный угол, который по сути является углом между линиями, представляющими предыдущее расстояние и текущее расстояние, с использованием правила косинуса.Я сделал это в своем алгоритме для различных возможных сценариев.
if CLASSES[idx] == "person":
heig = endY-startY
wid = endX-startX
currDistance = 23.0591-(0.0686*heig)
currCentX = (startX + (endX / 2.0))
currCentY = (startY + (endY / 2.0))
if initValues > 0:
if (prevCentX > currCentX):
if (prevCentY == currCentY):
horizDistMoved = abs((prevCentX-currCentX))
angle = degrees(acos(((currDistance**2 + prevDistance**2)-(horizDistMoved**2))/(2*currDistance*prevDistance)))
elif (prevCentY < currCentY):
horizDistMoved = hypot((prevCentX-currCentX),(currCentY-prevCentY))
angle = degrees(acos(((currDistance**2 + prevDistance**2)-(horizDistMoved**2))/(2*currDistance*prevDistance)))
elif (prevCentY > currCentY):
horizDistMoved = hypot((prevCentX-currCentX),(prevCentY-currCentY))
angle = degrees(acos(((currDistance**2 + prevDistance**2)-(horizDistMoved**2))/(2*currDistance*prevDistance)))
elif (prevCentX == currCentX):
horizDistMoved = 0
angle = 0
elif (prevCentX < currCentX):
if (prevCentY == currCentY):
horizDistMoved = abs((currCentX-prevCentX))
angle = degrees(acos(((currDistance**2 + prevDistance**2)-(horizDistMoved**2))/(2*currDistance*prevDistance)))
elif (prevCentY < currCentY):
horizDistMoved = hypot((currCentX-prevCentX),(currCentY-prevCentY))
angle = degrees(acos(((currDistance**2 + prevDistance**2)-(horizDistMoved**2))/(2*currDistance*prevDistance)))
elif (prevCentY > currCentY):
horizDistMoved = hypot((currCentX-prevCentX),(prevCentY-currCentY))
angle = degrees(acos(((currDistance**2 + prevDistance**2)-(horizDistMoved**2))/(2*currDistance*prevDistance)))
print("Angle is " +str(angle))
else:
time.sleep(0.2)
prevCentX = currCentX
prevCentY = currCentY
prevDistance = currDistance
initValues += 1
Я ожидал распечатки углов, когда человек двигается.Тем не менее, каждый раз, когда я двигаюсь, алгоритм падает с ошибкой ниже.Это происходит по-разному в зависимости от моей позиции.
Traceback (most recent call last):
File "Navigation+Servo_lite.py", line 146, in <module>
angle = degrees(acos(((currDistance**2 + prevDistance**2)-(horizDistMoved**2))/(2*currDistance*prevDistance)))
ValueError: math domain error
Я думаю, по какой-то причине выражение, составляющее делитель, продолжает оставаться равным нулю.Буду признателен за любые предложения о том, что может быть не так и как его улучшить, или если есть альтернативный способ расчета угла.
Весь кодовый блок длиннее, чем выше, но при необходимости я могувключите это также.
Спасибо.