python - 使用 Python 查找线外的点

标签 python opencv image-processing computer-vision augmented-reality

引用这里问的问题Drawing a line given the angle and a point on the line ,我写了一个 python 函数“find_normal”,它将法向量的斜率和 y 轴截距返回到给定角度的给定点。

现在我有一个点列表,我想验证这些点是否在给定角度的方向上超出了法向量。例如

  • Angle = 180:如果点位于线的左侧则为真,否则为假
  • Angle = 0:如果点在直线右侧则为真,否则为假
  • 0 < Angle < 180:如果点在直线下方则为真,否则为假
  • 180 < Angle < 360: 如果点在直线上方则为真,否则为假

为此,我编写了另一个函数 find_points_ahead,它使用 find_normal 的结果来突出显示超出法向量的所有点。如下面的屏幕截图所示。

enter image description here

但是在某些角度,一些不符合标准的点也被高亮显示了。例如,箭头指向下方,只有红线以下的点应该突出显示。相反,线上方的一些点也被突出显示。有人可以帮我吗?

def find_normal(img,point,angle):

    x1=point[0]
    y1=point[1]
    angle_rad=np.radians(angle)

    c=-1*np.sin(angle_rad)
    s=np.cos(angle_rad)

    start_x=int(x1 - c * 640)
    start_y=int(y1 - s * 640)
    end_x=int(x1 + c * 640)
    end_y=int(y1 + s * 640)

    m=int((end_y-start_y)/(end_x-start_x))
    y_intercept=end_y-(m*end_x)

    cv2.line(img, (start_x,start_y), (end_x,end_y), [0, 0, 255], 3, cv2.LINE_AA)

    return m,y_intercept


def find_points_ahead(img,base_point,angle,points):

    m,c=find_normal(img,base_point,angle)

    for pt in points:
        pt_x=pt[0]
        pt_y=pt[1]
        result=m*pt_x-pt_y+c
        if angle>0 and angle<180 and result<0:
            cv2.circle(img,(pt_x,pt_y),3,[0,0,255],3,cv2.LINE_AA)
        elif angle>180 and angle<360 and result>0:
            cv2.circle(img,(pt_x,pt_y),3,[0,0,255],3,cv2.LINE_AA)

最佳答案

如果 c 和 s 是角度的余弦和正弦,函数必须对点 (x, y) 返回 True 当且仅当 c*(x-x1) + s*(y-y1) >= 0 where (x1, y1) 是红线上的任意一点。

关于python - 使用 Python 查找线外的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45505032/

相关文章:

image - 如何使用matlab去除图像上的划痕

python - 如何在 Python 中解析特定子字符串旁边的值

c++ - 将 Python 代码编译为 Pascal DLL

python - 将图像转换为二进制文件后,无法在带有matplotlib的笔记本中显示图像

visual-c++ - 获取图像的像素值

python - cv2 轮廓无法检测到某些形状

python - 使用 MaxNLocator 绘制 pandas 条形图会导致标签错误

python - Django il8n - 在 Windows 上翻译外部应用程序

python - 规范化,同时将 'dst' 的值保持为空数组

python - 如何解决错误 "can' t 将序列乘以类型 'float' 的非 int ”?