Нарисуйте Перпендикулярную линию к линии в opencv - PullRequest
11 голосов
/ 29 декабря 2011

Я лучше объясню свою проблему с изображением

У меня есть контур и линия , которая проходит через этот контур.
В пересечение точка контура и линии Я хочу нарисовать перпендикулярную линию в точке пересечения линии и контура до определенного расстояния.
Я знаю точку пересечения , а также наклон линии.
Для справки я прилагаю это изображение.enter image description here

Ответы [ 2 ]

8 голосов
/ 29 декабря 2011

Если синяя линия на вашем изображении идет от точки А к точке Б, и вы хотите нарисовать красную линию в точке Б, вы можете сделать следующее:

  1. Получить вектор направления движенияот A до B. Это будет: v.x = B.x - A.x; v.y = B.y - A.y;
  2. Нормализовать вектор: mag = sqrt (v.x*v.x + v.y*v.y); v.x = v.x / mag; v.y = v.y / mag;
  3. Поверните вектор на 90 градусов, поменяв местами x и y и инвертировав одно из них.Примечание о направлении вращения: в OpenCV и обработке изображений в целом оси x и y на изображении не ориентированы по евклидову пути, в частности, ось y направлена ​​вниз, а не вверх.В евклидовом инвертирование конечного x (начальный y) будет вращаться против часовой стрелки (стандартно для евклидова), а инвертирование y будет вращаться по часовой стрелке.В OpenCV все наоборот.Так, например, чтобы получить вращение по часовой стрелке в OpenCV: temp = v.x; v.x = -v.y; v.y = temp;
  4. Создайте новую линию в точке B, указывающую в направлении v: C.x = B.x + v.x * length; C.y = B.y + v.y * length; (Обратите внимание, что вы можете расширить ее в обоих направлениях, создавточка D в противоположном направлении, просто отрицая длину.)
2 голосов
/ 17 января 2018

Это моя версия функции:

def getPerpCoord(aX, aY, bX, bY, length):
    vX = bX-aX
    vY = bY-aY
    #print(str(vX)+" "+str(vY))
    if(vX == 0 or vY == 0):
        return 0, 0, 0, 0
    mag = math.sqrt(vX*vX + vY*vY)
    vX = vX / mag
    vY = vY / mag
    temp = vX
    vX = 0-vY
    vY = temp
    cX = bX + vX * length
    cY = bY + vY * length
    dX = bX - vX * length
    dY = bY - vY * length
    return int(cX), int(cY), int(dX), int(dY)
...