问题描述
我有兴趣在给定等边三角形角的3个2D投影/像素坐标的情况下找到平面的法线向量。
我不得不修改我的实际用例,因为不允许我分享细节:在我的用例中,我有一个等边三角形的海报固定在墙上。我可以检测像素坐标中的3个角,并想要计算直接从墙出来的三角形的法线向量。
我的直觉是应该为此提供一种分析解决方案,我发现了类似的问题,但未能将其应用于我的用例。这是我的一些想法:
-
我考虑过通过添加第三个尺寸为零的二维尺寸将其放置在XY平面上,从而将2D像素坐标转化为3D。对边长为1的参考三角形进行相同的操作,可以为我提供寻找其单应性的来源和目的地。但是因为所有6个z值均为0,所以我认为这不起作用。
-
我知道3D中所有三个点之间的距离是相同的,因此我希望将其用作约束来解决该问题。
-
可以通过获取三角形2个边的叉积来在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))
但是,变换看起来完全错误,我仍然需要知道如何从变换矩阵计算法线。
解决方法
您不能真正从三个2D点获得100%正确的3D法线向量。
例如,让我们考虑一个针孔摄像头系统,从一个点到一个摄像头画一条线,然后在我们绘制的线上随机选取另一个点,您仍然会拥有与所拾取点相同的图像。
如果我们添加所有三个点之间的距离相同的条件,则您可能最多仍然有4个向量的可能答案(想象两个固定点,最后一个点的可能位置与两个固定点具有相同的距离)点将是一个圆,从相机开始画一条线以附加圆,如果您切过该圆,则最后一个点有两个可能的位置,唯一的条件是只有一个位置为真,该线是圆的切线,但是在大多数情况下不会发生这种情况,请更改固定点,以便我们最多可以在三个点中拥有4个可能的位置)
您不能仅通过获取3点的平均坐标来添加第4点,因为您不知道质心的实际位置在图像平面上的投影位置。