Python 给定等边三角形的二维角坐标的三维法向量

Python 给定等边三角形的二维角坐标的三维法向量,python,opencv,transformation,perspective,homography,Python,Opencv,Transformation,Perspective,Homography,我感兴趣的是找到一个平面的法向量,给定一个等边三角形的角点的三维投影/像素坐标 我必须修改我的实际用例,因为我不允许分享细节:在我的用例中,我有一张等边三角形的海报钉在墙上。我可以检测像素坐标中的3个角,并想计算三角形的法向量,该三角形直接从墙中出来 我的直觉是,应该有一个分析解决方案,我发现了类似的问题,但没有将它们应用到我的用例中。以下是我的一些想法: 我想通过添加一个填充有零的第三维度,将二维像素坐标转换为三维,将其放在XY平面上。对边长为1的参考三角形进行同样的操作,可以为我找到它们的

我感兴趣的是找到一个平面的法向量,给定一个等边三角形的角点的三维投影/像素坐标

我必须修改我的实际用例,因为我不允许分享细节:在我的用例中,我有一张等边三角形的海报钉在墙上。我可以检测像素坐标中的3个角,并想计算三角形的法向量,该三角形直接从墙中出来

我的直觉是,应该有一个分析解决方案,我发现了类似的问题,但没有将它们应用到我的用例中。以下是我的一些想法:

  • 我想通过添加一个填充有零的第三维度,将二维像素坐标转换为三维,将其放在XY平面上。对边长为1的参考三角形进行同样的操作,可以为我找到它们的单应性提供来源和目的地。但因为所有6个z值都是0,我认为这不起作用

  • 我知道所有3个点之间的距离在3D中是相同的,我想用它作为约束来解决这个问题

  • 通过取三角形两条边的叉积,可以在3D中计算法线

  • 使用openCV的findHomography()函数需要至少4个3D点来求解,我不相信我可以在像素空间中取3个点的平均坐标来找到中心(也就是第4个点),对吗

openCV还附带了一个getAffineTransform()函数,该函数可处理3对二维点。我试着这样使用它:

# equilateral reference triangle
tri_ref = np.array([
  [0.0,0.0],
  [0.5,0.866],
  [1.0,0.0]
], dtype=np.float32)

# detected corners in pixel space
tri_pixel = np.array([
    [0.397,0.317],
    [0.441,0.848],
    [0.698,0.324]
], dtype=np.float32)

A = cv2.getAffineTransform(tri_pixel, tri_ref)

img2 = cv2.warpAffine(img1, A, (400,300))

但是,变换看起来完全错误,我仍然需要知道如何从变换矩阵计算法线。

从三个2D点无法获得100%正确的3D法线向量。

例如,让我们考虑一个针孔相机系统,画一条线从一个点到相机,然后随机选择另一个点在我们画的线,你仍然会有相同的图像与拾取点。 如果我们加上三个点之间的距离相同的条件,你可能仍然有最多4个向量的可能答案(对两个固定点进行成像,最后一个与两个固定点具有相同距离的点的可能位置将是一个圆,从相机开始画一条线以附加该圆,如果您穿过该圆而不是最后一个点的两个可能位置,则只有一个位置为真的条件是该线为圆的切线,但大多数情况下不会发生这种情况,请更改固定点,这样我们最多可以得到三个点的4个可能位置)


您不能仅通过获取3个点的平均坐标来添加第4个点,因为您不知道质心投影到图像平面的实际位置。

感谢您的解释。正如您在圆示例中所示,我的天真假设存在缺陷。我通过包含第4个点来解决此问题。