Ошибка вычисления угла смещения с помощью Computer Vision - PullRequest
1 голос
/ 08 июня 2019

Я использую обнаружение объектов глубокого обучения для отслеживания одного человека в пространстве с помощью 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

Я думаю, по какой-то причине выражение, составляющее делитель, продолжает оставаться равным нулю.Буду признателен за любые предложения о том, что может быть не так и как его улучшить, или если есть альтернативный способ расчета угла.

Весь кодовый блок длиннее, чем выше, но при необходимости я могувключите это также.

Спасибо.

...