在opencv中绘制垂直线到一条线

Waz*_*azy 11 opencv line draw contour

我最好用Image来解释我的问题

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

use*_*321 8

如果图片中的蓝线从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轴指向下而不是向上.在Euclidian中,反转最终的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来使其在两个方向上延伸.)


小智 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)
Run Code Online (Sandbox Code Playgroud)

  • 您可以删除 `if(vX == 0 or vY == 0): return 0, 0, 0, 0`,代码在这种情况下工作得很好。无论如何,感谢您发布此信息! (3认同)