给定等边三角形的 2D 角坐标的 3D 法向量
3D normal vector given 2D corner coordinates of an equilateral triangle
我对给定等边三角形角的 3 2D projection/pixel 坐标找到平面的法向量很感兴趣。
我必须修改我的实际用例,因为我不允许分享细节:在我的用例中,我有一张等边三角形的海报固定在墙上。我可以检测像素坐标中的 3 个角,并想计算直接从墙上出来的三角形的法向量。
我的直觉是应该有一个分析解决方案,我发现了类似的问题,但未能将它们应用到我的用例中。以下是我的一些想法:
我想通过添加一个填充零的第三维将其置于 XY 平面上,从而将 2D 像素坐标变为 3D。对边长为 1 的参考三角形执行相同的操作,可以为我提供找到它们的单应性的来源和目的地。但是因为所有 6 个 z 值都是 0,所以我认为这行不通。
我知道所有 3 个点之间的距离在 3D 中是相同的,我想将其用作解决问题的约束。
法线可以通过取三角形两条边的叉积在 3D 中计算
使用 openCV 的 findHomography() 函数需要至少 4 个 3D 点来解决,我不相信我可以只取像素 space 中的 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))
但是,转换看起来完全错误,我仍然需要知道如何从转换矩阵计算法线。
您无法从三个 2D 点真正获得 100% 正确的 3D 法向量。
例如,让我们考虑一个针孔相机系统,从一个点到相机画一条线,然后在我们画的线上随机选择另一个点,你仍然会得到与选择的点相同的图像。
如果我们加上三个点之间的距离相同的条件,你可能仍然有最多4个向量的可能答案(想象两个固定点,最后一个点与两个固定点距离相同的可能位置点将是一个圆圈,从相机开始画一条线来附加圆圈,如果你穿过圆圈比最后一个点有两个可能的位置,唯一的条件只有一个位置是真实的是线是圆的切线,但大多数时候不会发生这种情况,改变固定点,这样我们最多可以有 4 个可能的三点位置)
您不能仅通过取 3 个点的平均坐标来添加第 4 个点,因为您不知道质心投影到图像平面的实际位置。
我对给定等边三角形角的 3 2D projection/pixel 坐标找到平面的法向量很感兴趣。
我必须修改我的实际用例,因为我不允许分享细节:在我的用例中,我有一张等边三角形的海报固定在墙上。我可以检测像素坐标中的 3 个角,并想计算直接从墙上出来的三角形的法向量。
我的直觉是应该有一个分析解决方案,我发现了类似的问题,但未能将它们应用到我的用例中。以下是我的一些想法:
我想通过添加一个填充零的第三维将其置于 XY 平面上,从而将 2D 像素坐标变为 3D。对边长为 1 的参考三角形执行相同的操作,可以为我提供找到它们的单应性的来源和目的地。但是因为所有 6 个 z 值都是 0,所以我认为这行不通。
我知道所有 3 个点之间的距离在 3D 中是相同的,我想将其用作解决问题的约束。
法线可以通过取三角形两条边的叉积在 3D 中计算
使用 openCV 的 findHomography() 函数需要至少 4 个 3D 点来解决,我不相信我可以只取像素 space 中的 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))
但是,转换看起来完全错误,我仍然需要知道如何从转换矩阵计算法线。
您无法从三个 2D 点真正获得 100% 正确的 3D 法向量。
例如,让我们考虑一个针孔相机系统,从一个点到相机画一条线,然后在我们画的线上随机选择另一个点,你仍然会得到与选择的点相同的图像。
如果我们加上三个点之间的距离相同的条件,你可能仍然有最多4个向量的可能答案(想象两个固定点,最后一个点与两个固定点距离相同的可能位置点将是一个圆圈,从相机开始画一条线来附加圆圈,如果你穿过圆圈比最后一个点有两个可能的位置,唯一的条件只有一个位置是真实的是线是圆的切线,但大多数时候不会发生这种情况,改变固定点,这样我们最多可以有 4 个可能的三点位置)
您不能仅通过取 3 个点的平均坐标来添加第 4 个点,因为您不知道质心投影到图像平面的实际位置。