【问题标题】:3D normal vector given 2D corner coordinates of an equilateral triangle给定等边三角形的 2D 角坐标的 3D 法线向量
【发布时间】:2020-12-29 01:41:28
【问题描述】:

我有兴趣在给定等边三角形角的 3 个 2D 投影/像素坐标的情况下找到平面的法线向量。

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

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

  • 我考虑通过添加一个填充为零的第三维将 2D 像素坐标置于 XY 平面上,从而将 2D 像素坐标变为 3D。对边长为 1 的参考三角形做同样的事情给了我找到它们的单应性的来源和目的地。但是因为所有 6 个 z 值都是 0,所以我认为这行不通。

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

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

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

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))

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

【问题讨论】:

    标签: python opencv transformation perspective homography


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的解释。正如您在圆形示例中所展示的那样,我的幼稚假设是有缺陷的。我通过加入第四点来解决这个问题。
    猜你喜欢
    • 2010-12-03
    • 2013-02-07
    • 2013-09-10
    • 2017-06-30
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2023-01-30
    相关资源
    最近更新 更多