<div dir="ltr">Hi Francisco,<div><br></div><div>The ICP implementation in ITK uses the Levenberg Marquardt optimizer, </div><div>which in ITK is a wrapper of the VNL class vnl_levenberg_marquardt,</div><div>that in turn is a wrapper around FORTRAN routines.</div>
<div><br></div><div>You may find interesting to look at:</div><div><a href="https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/ThirdParty/VNL/src/vxl/core/vnl/algo/vnl_levenberg_marquardt.cxx#L458">https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/ThirdParty/VNL/src/vxl/core/vnl/algo/vnl_levenberg_marquardt.cxx#L458</a><br>
</div><div><br></div><div>that is the method:</div><div><span class="" style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre;background-color:rgb(255,255,255)"><br>
</span></div><div><span class="" style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre;background-color:rgb(255,255,255)">vnl_matrix</span><span class="" style="font-weight:bold;color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">&lt;</span><span class="" style="color:rgb(68,85,136);font-weight:bold;font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">double</span><span class="" style="font-weight:bold;color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">&gt;</span><span style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre"> </span><span class="" style="font-weight:bold;color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">const</span><span class="" style="font-weight:bold;color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">&amp;</span><span style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre"> </span><span class="" style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre;background-color:rgb(255,255,255)">vnl_levenberg_marquardt</span><span class="" style="font-weight:bold;color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">::</span><span class="" style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre;background-color:rgb(255,255,255)">get_JtJ</span><span class="" style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">()</span></div>
<div><span class="" style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre"><br></span></div><div><span class="" style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">that computes the inverse of the Covariance matrix.</span></div>
<div><span class="" style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre"><br></span></div><div><span class="" style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">One could get access to the vnl_levenberg_marquardt optimizer </span><span style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">object</span></div>
<div><span style="color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;font-size:11.818181991577148px;line-height:17.99715805053711px;white-space:pre">by adding a Get method to the itkLevenbergMarquardtOptimizer, </span><span style="font-size:12px;line-height:17.984375px;white-space:pre;color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace">and </span></div>
<div><span style="font-size:12px;line-height:17.984375px;white-space:pre;color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace">returning the InternalOptimizerType m_VnlOptimier member variable:</span></div>
<div><span style="font-size:12px;line-height:17.984375px;white-space:pre;color:rgb(51,51,51);font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace"><br></span></div><div><a href="https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Numerics/Optimizers/include/itkLevenbergMarquardtOptimizer.h#L89">https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Numerics/Optimizers/include/itkLevenbergMarquardtOptimizer.h#L89</a><font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><span style="font-size:12px;line-height:17.984375px;white-space:pre"><br>
</span></font></div><div><br></div><div><br></div><div><br></div><div>  Hope this helps,</div><div><br></div><div>      Best</div><div><br></div><div>         Luis</div><div><br></div></div><div class="gmail_extra"><br><br>
<div class="gmail_quote">On Wed, Nov 20, 2013 at 5:29 AM, Francisco Javier Pérez Grau <span dir="ltr">&lt;<a href="mailto:fjperezgrau@gmail.com" target="_blank">fjperezgrau@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div><div>Hello Luis,<br>My name is Francisco Perez, and I am 
currently involved in a robotics project for navigation based on 3D 
imaging sensors such as Kinect. I am looking for ICP implementations in 
order to perform registration of consecutive point clouds, and found 
&#39;ITK&#39; so I am playing a little bit with it, it looks promising! 
Congratulations on this job!<br>
</div>I have one concern though, because my idea is to generate odometry
 and integrate with other sensors, and I don&#39;t know if I can obtain the 
covariance matrix of this calculation. How could I obtain this matrix? 
Is it calculated at all?<br>
</div>Thank you in advance,<br>Francisco.</div>
</blockquote></div><br></div>