给定等边三角形的 2D 角坐标的 3D 法向量

3D normal vector given 2D corner coordinates of an equilateral triangle

我对给定等边三角形角的 3 2D projection/pixel 坐标找到平面的法向量很感兴趣。

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

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

openCV 还附带了一个 getAffineTransform() 函数,它适用于 3 对 2D 点。我试过这样使用它:

# 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 个点,因为您不知道质心投影到图像平面的实际位置。