我在旧版本的 MathCAD 中解决了这个问题:
编辑:MathCAD 屏幕截图中的措辞错误:“已知:g和b相互垂直”
在 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 z和b 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 z和b z来“最小化”误差,得到两个 Z 值:
g = (79.5, -48.5, 102.5)
b = (-110.8, -62.8, 56.2)
然后让我计算其他有趣的值。
g和b的长度(以像素为单位):
| 克| = 138.5
| 乙| = 139.2
法线向量:
g x b = (3710, -15827, -10366)
单位法线(长度1):
u N = (0.1925, -0.8209, -0.5377)
正常缩放到与g和b (138.9)相同的长度(以像素为单位):
正常 = (26.7, -114.0, -74.7)
现在我有了与g和b长度相同的法线,我将它们绘制在同一张图片上:
我认为您将遇到一个新问题:相机镜头引入的失真。这三个点没有完美地投影到二维摄影平面上。存在球面变形,使直线不再笔直,使相等的长度不再相等,并使法线略微偏离法线。
微软研究有一个算法来计算如何纠正相机的失真:
一种灵活的相机校准新技术
但这超出了我的范围:
我们提出了一种灵活的新技术来轻松校准相机。它非常适合在没有 3D 几何或计算机视觉专业知识的情况下使用。该技术只需要相机观察在几个(至少两个)不同方向上显示的平面图案。相机或平面图案都可以自由移动。运动不需要知道。径向镜头畸变被建模。所提出的程序包括一个封闭形式的解决方案,然后是基于最大似然准则的非线性细化。计算机模拟和真实数据都用于测试所提出的技术,并获得了很好的结果。与使用昂贵设备(例如两个或三个正交平面)的经典技术相比,所提出的技术易于使用且灵活。
他们有一个示例图像,您可以在其中看到失真:
(来源:microsoft.com)
笔记
- 您不知道您看到的是纸板的“顶部”还是“底部”,因此法线可以垂直镜像(即 z = -z)
更新
Guy 在派生的代数公式中发现了一个错误。修复它会导致公式,我不认为,有一个简单的封闭形式。这还不错,因为无论如何都无法完全解决;但在数字上。
这是 Excel 的屏幕截图,我从两个已知规则开始:
g · b = 0
和
| 克| = | 乙|
将第二个写为差异(“错误”数量),然后您可以将两者相加并将该值用作数字以使 excel 的求解器最小化:
这意味着您必须编写自己的数字迭代求解器。我正在盯着我的大学工程数值方法教科书;我知道它包含求解没有简单封闭形式的递归方程的算法。