16

我最好用一张图片来解释我的问题

我有一个轮廓和一条穿过该轮廓的线。
在轮廓和线的交点处,我想在一条线和轮廓的交点处绘制一条垂直线,直到特定距离。
我知道交点以及线的斜率
作为参考,我附上了这张图片。 在此处输入图像描述

4

2 回答 2

13

如果你图片中的蓝线从 A 点到 B 点,而你想在 B 点画红线,你可以这样做:

  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. 通过交换 x 和 y 并将其中一个反转,将矢量旋转 90 度。关于旋转方向的注意事项:在 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; 请注意,您可以通过简单地对 length 取反来创建一个相反方向的点 D,从而使其在两个方向上延伸。)
于 2011-12-29T07:11:27.790 回答
7

这是我的功能版本:

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)
于 2018-01-17T17:04:17.507 回答