10

嘿,数学极客,我有一个问题一直困扰着我一段时间。这是一个个人项目。

我有三个点:红色、绿色和蓝色。它们位于纸板上,红点位于左下角 (0,0),蓝点位于右下角 (1,0),绿点位于左上角。想象一下退后一步,从某个角度为卡片拍照。如果您要找到图片中每个点的中心(假设单位是像素),您将如何找到图片中卡片脸部的法线向量(相对于相机)?

现在我对这个问题有几点看法:

  1. 这些点(在“现实生活”中)总是成直角。在图片中,只有当相机沿着“轴”(轴是由红色和蓝色或红色和绿色点创建的线)围绕红点旋转时,它们才处于直角。
  2. 卡片只有一侧有点。因此,您知道您永远不会看到它的背面。
  3. 卡到相机的距离无关紧要。如果我知道每个点的深度,这会容易得多(只是一个简单的叉积,不是吗?)。
  4. 卡片的轮换与我要查找的内容无关。在我一直在努力解决这个问题的过程中,最终可以在法线向量的帮助下找到旋转。我不知道旋转是否是寻找法线向量的一部分(或产物)。

希望那里有人做到这一点,或者是一个数学天才。我有两个朋友在这里帮助我,我们 - 到目前为止 - 没有成功。

4

6 回答 6

16

我在旧版本的 MathCAD 中解决了这个问题:

替代文字

编辑:MathCAD 屏幕截图中的措辞错误:“已知:gb相互垂直

在 MathCAD 中,我忘记了做叉积的最后一步,我将从我之前的答案中复制粘贴到这里:

现在我们已经解决了平移 g 和 b 点的 XYZ,您最初的问题需要平面的法线。

如果 cross g x b,我们将得到两个法线向量:

        | u1  u2  u3 |
g x b = | g1  g2  g3 |
        | b1  b2  b3 |  

      = (g2b3 - b2g3)u1 + (b1g3 - b3g1)u2 + (g1b2 - b1g2)u3

所有值都是已知的,将它们插入(我不会写出替换为 g3 和 b3 的版本,因为它太长而且太丑了,无法提供帮助。

但实际上,我认为您必须以数字方式解决它,调整g zb z以最适合条件:

g · b = 0

| | = | |

由于像素在代数上不是完美的。

例子

使用一张阿波罗 13 号宇航员装配命令模块的方形氢氧化锂罐在 LEM 中工作的照片,我找到了角落:

替代文字

使用它们作为我的 XY 平面的基础:

替代文字

我使用 Photoshop 记录了像素位置,正 X 向右,正 Y 向下(以保持 Z 的右手规则“进入”图片):

g = (79.5, -48.5, g z )

b = (-110.8, -62.8, bz )

将两个起始公式打入 Excel,并使用分析工具包通过调整g zb z来“最小化”误差,得到两个 Z 值:

g = (79.5, -48.5, 102.5)

b = (-110.8, -62.8, 56.2)

然后让我计算其他有趣的值。

gb的长度(以像素为单位):

| | = 138.5

| | = 139.2

法线向量:

g x b = (3710, -15827, -10366)

单位法线(长度1):

u N = (0.1925, -0.8209, -0.5377)

正常缩放到与gb (138.9)相同的长度(以像素为单位):

正常 = (26.7, -114.0, -74.7)

现在我有了与gb长度相同的法线,我将它们绘制在同一张图片上:

替代文字

我认为您将遇到一个新问题:相机镜头引入的失真。这三个点没有完美地投影到二维摄影平面上。存在球面变形,使直线不再笔直,使相等的长度不再相等,并使法线略微偏离法线。

微软研究有一个算法来计算如何纠正相机的失真:

一种灵活的相机校准新技术

但这超出了我的范围:

我们提出了一种灵活的新技术来轻松校准相机。它非常适合在没有 3D 几何或计算机视觉专业知识的情况下使用。该技术只需要相机观察在几个(至少两个)不同方向上显示的平面图案。相机或平面图案都可以自由移动。运动不需要知道。径向镜头畸变被建模。所提出的程序包括一个封闭形式的解决方案,然后是基于最大似然准则的非线性细化。计算机模拟和真实数据都用于测试所提出的技术,并获得了很好的结果。与使用昂贵设备(例如两个或三个正交平面)的经典技术相比,所提出的技术易于使用且灵活。

他们有一个示例图像,您可以在其中看到失真:

替代文字
(来源:microsoft.com

笔记

  • 您不知道您看到的是纸板的“顶部”还是“底部”,因此法线可以垂直镜像(即 z = -z)

更新

Guy 在派生的代数公式中发现了一个错误。修复它会导致公式,我不认为,有一个简单的封闭形式。这还不错,因为无论如何都无法完全解决;但在数字上。

这是 Excel 的屏幕截图,我从两个已知规则开始:

g · b = 0

| | = | |

将第二个写为差异(“错误”数量),然后您可以将两者相加并将该值用作数字以使 excel 的求解器最小化

替代文字

这意味着您必须编写自己的数字迭代求解器。我正在盯着我的大学工程数值方法教科书;我知道它包含求解没有简单封闭形式的递归方程的算法。

于 2010-01-14T22:32:22.150 回答
2

从它的声音来看,您有三个点p 1p 2p 3定义了一个平面,并且您想要找到该平面的法线向量。

将点表示为来自原点的向量,法线向量的方程为n
= ( p 2 - p 1 )x( p 3 - p 1 )
(其中 x 是两个向量的叉积)

如果你想让向量从卡片的正面向外指向,那么根据右手法则,设置
p 1 = red(左下) dot
p 2 = blue(右下) dot
p 3 = green(上-左)点

于 2010-01-10T01:41:26.503 回答
2

@ Ian Boyd ...我喜欢你的解释,只是当你说要解决b z时,我被困在第 2 步。你的答案中仍然有b z,我认为你的答案中不应该有b z ......

b z应该是g x 2 + g y 2 + g z 2 - b x 2 - b y 2的 +/- 平方根

在我自己这样做之后,我发现当你求解 g z时很难将b z代入第一个方程,因为当代入 b z时,你现在会得到:

g z = -(g x b x + g y b y ) / sqrt( g x 2 + g y 2 + g z 2 - b x 2 - b y 2 )

使这变得困难的部分是平方根中有g z ,所以你必须将它分开并将g z组合在一起,然后求解g z我做了,只是我不认为我解决它的方式是正确的,因为当我编写程序为我计算g z时,我使用了您的g xg y值来查看我的答案是否与您的相符,但事实并非如此。

所以我想知道你是否可以帮助我,因为我真的需要让它为我的一个项目工作。谢谢!

于 2010-09-14T21:41:09.260 回答
1

只是想我的脚在这里。

您的有效输入是视比 RB/RG [+]、视角 BRG 以及(比如说)RB 与您的屏幕坐标 y 轴形成的角度(我错过了什么吗)。您需要归一化法线(嘿!)向量的分量,我相信这只是两个独立的值(尽管如果卡片是透明的,您会留下前后歧义)。[++]

所以我猜这是可能的......

从这里开始,我假设 RB 的视角始终为 0,我们可以稍后围绕 z 轴旋转最终解。

从与观察平面平行放置并以“自然”方式定向的卡片开始(即尊重您的上与下和左与右分配)。我们可以通过\theta围绕初始 x 轴(对于-\pi/2 < \theta < \pi/2)旋转,然后\phi围绕初始 y 轴(对于-\pi/2 < \phi < \pi/2)旋转来到达卡片的所有有趣位置。请注意,我们保留了 RB 矢量的明显方向。

下一步根据 and 计算表观比和表观角度\theta\phi反转结果。 [+++]

法线将R_y(\phi)R_x(\theta)(0, 0, 1)用于R_i围绕轴的原始旋转矩阵i

[+] 绝对长度不计算在内,因为它只是告诉你到卡片的距离。

[++] 再假设:卡片到观察平面的距离远大于卡片的尺寸。

[+++] 这里你使用的从三维空间到观察平面的投影很重要。这是困难的部分,但除非您说出您使用的是什么投影,否则我们无法为您做任何事情。如果您使用的是真实相机,那么这是透视投影,基本上任何有关 3D 图形的书籍都对此进行了介绍。

于 2010-01-10T03:55:34.583 回答
0

对,法线向量不会随距离而变化,但纸板在图片上的投影确实会随距离而变化(简单:如果你有一个小纸板,没有任何变化。如果你有一个 1 英里宽和 1 英里高的纸板,并且你旋转它,使一侧更近,另一侧更远,在图片上近侧被放大而远侧被缩短。你可以立即看到一个矩形不再是矩形,而是一个梯形)

对于小角度和以中间为中心的相机,最准确的方法是测量中间线上的“正常”图像和角度图像之间的宽度/高度比(因为它们没有翘曲)。

我们将 x 定义为从左到右,y 定义为从下到上,z 定义为从远到近。

然后
x = arcsin(measuredWidth/normWidth) 红蓝
y = arcsin(measuredHeight/normHeight) 红绿
z = sqrt(1.0-x^2-y^2)

我明天会计算一个更精确的解决方案,但我现在太累了......

于 2010-01-10T02:19:28.257 回答
0

您可以使用 u,v,n 坐标。将您的视点设置为“眼睛”或“相机”的位置,然后将 x、y、z 坐标转换为 u、v、n。从那里您可以确定法线以及透视和可见表面(如果需要)(u',v',n')。另外,请记住 2D = 3D,z=0。最后,确保使用同质坐标。

于 2010-01-21T05:35:59.457 回答