<p>我目前正在与国际比较项目斗争。以下是我迄今为止收集到的资料:</p>
<p>国际比较项目包括三个步骤:</p>
<ul>
<li>给定两个点云A和B,在A和B之间找到可能表示空间中相同点的点对。通常,只需将每个点与其在另一个云中最近的相邻点匹配即可完成此操作,但可以使用其他特征(例如颜色、纹理或曲面法线)来改进匹配。然后可以选择丢弃最差的匹配项。</li>
<li>给出对应对的列表,找到从A到B的最佳转换</li>
<li>将此转换应用于</li>
<li>重复这三个步骤,直到找到一个可接受的解决方案。</li>
</ul>
<p>第一步很简单,虽然有很多方法可以优化它的速度,因为这是ICP的主要性能瓶颈;提高精度,因为这是误差的主要来源。OpenCV可以帮助您处理<a href="http://docs.opencv.org/trunk/modules/flann/doc/flann_fast_approximate_nearest_neighbor_search.html">FLANN library</a>。</p>
<p>我想你的麻烦在于第二步,在给出一个对应关系列表的情况下,找到最佳的转换。</p>
<p>一种常见的方法可以与<a href="http://en.wikipedia.org/wiki/Singular_value_decomposition">Singular Value Decomposition (SVD)</a>一起使用。这是算法的草图。对ICP&SVD的研究将提供更多的参考。</p>
<ul>
<li>取对应点A<sub>1</sub>的列表。A<sub>n</sub>和B<sub>1</sub>。B<sub>n</sub>从步骤1开始</li>
<li>计算a中所有点的质心C<sub>a</sub>,b中所有点的质心C<sub>b</sub></li>
<li>计算3x3协方差矩阵M<br/>
M=(A<sub>1</sub>-C<sub>A</sub>)*(B<sub>1</sub>-C<sub>B</sub>)<sup>T</sup>+。。。+(A<sub>n</sub>-C<sub>A</sub>)*(B<sub>n</sub>-C<sub>B</sub>)<sup>T</sup></li>
<li>使用SVD计算M<br/>的3x3矩阵U和V
<em>(OpenCV有一个<a href="http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#SVD">function to perform SVD</a>)</em></li>
<li>计算R=U*V<sup>T<sup><br/>
这是你想要的最佳旋转矩阵。</li>
<li>计算最佳平移为C<sub>b</sub>-R*C<sub>a</sub></li>
<li>最佳转换是R和这个翻译的组合</li>
</ul>
<p>请注意,我自己还没有实现这个算法,所以我只是解释我读到的内容。</p>