【发布时间】: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