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

问题描述

我有兴趣在给定等边三角形角的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点,因为您不知道质心的实际位置在图像平面上的投影位置。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...