<div>Hi Luis,</div>
<div><br>Thank you very much. Yes, I declared PointSet as float, Transform as double. But, after I changed the PointSet to double, the compile error is still there. I am using Visual Studio 2005. The compiler gave this:<br>
Error 1 error C2664: &#39;itk::MatrixOffsetTransformBase&lt;TScalarType,NInputDimensions,NOutputDimensions&gt;::TransformPoint&#39; : cannot convert parameter 1 from &#39;PointType&#39; to &#39;const itk::Point&lt;TCoordRep,NPointDimension&gt; &amp;&#39; c:\steven\gdc.cpp 1379
<br>I am not sure whether this is the full error message though.<br>&nbsp;</div>
<div>==========================================<br>The code is like this:<br>IterativeClosestPoint(CString tFixedPointsFile, CString tMovingPointFile, CString tRegisteredPointsFile, double tResultParametre[ ])<br>{<br>//convert filename parametres to char*
</div>
<div>CStringA fixedFileName(tFixedPointsFile);<br>CStringA movingFileName(tMovingPointFile);<br>CStringA registeredFileName(tRegisteredPointsFile);<br><br>int i = 0; int j = 0;<br>double pi = 3.1415926535897932384626;<br>
<br>typedef itk::PointSet&lt; double, Dimension &gt;&nbsp;&nbsp; PointSetType;<br>PointSetType::Pointer fixedPointSet&nbsp;&nbsp;= PointSetType::New();<br>PointSetType::Pointer movingPointSet = PointSetType::New();<br>PointSetType::Pointer registeredPointSet = PointSetType::New();
<br>typedef PointSetType::PointType&nbsp;&nbsp;&nbsp;&nbsp; PointType;<br>PointType fixedPoint;<br>PointType movingPoint;<br>PointType registeredPoint;<br>typedef PointSetType::PointsContainer&nbsp;&nbsp;PointsContainer;<br>PointsContainer::Pointer fixedPointContainer&nbsp;&nbsp;= PointsContainer::New();
<br>PointsContainer::Pointer movingPointContainer = PointsContainer::New();<br>PointsContainer::Pointer registeredPointContainer = PointsContainer::New();<br><br>// Read the file containing coordinates of fixed points.<br>
std::ifstream&nbsp;&nbsp; fixedFile;<br>fixedFile.open( fixedFileName );<br>if( fixedFile.fail() )<br>{<br>&nbsp;&nbsp;return -1;<br>}<br><br>unsigned int pointId = 0;<br>fixedFile &gt;&gt; fixedPoint;<br>while( !fixedFile.eof() )<br>{<br>&nbsp;&nbsp;pointId++;
<br>}<br>fixedPointSet-&gt;SetPoints( fixedPointContainer );<br><br>// Read the file containing coordinates of moving points.<br>std::ifstream&nbsp;&nbsp; movingFile;<br>movingFile.open( movingFileName );<br>if( movingFile.fail() )
<br>{<br>&nbsp;&nbsp;return -1;<br>}<br><br>pointId = 0;<br>movingFile &gt;&gt; movingPoint;<br>while( !movingFile.eof() )<br>{<br>&nbsp;&nbsp;movingPointContainer-&gt;InsertElement( pointId, movingPoint );<br>&nbsp;&nbsp;movingFile &gt;&gt; movingPoint;
<br>&nbsp;&nbsp;pointId++;<br>}<br>movingPointSet-&gt;SetPoints( movingPointContainer );<br><br>// Set up&nbsp;&nbsp;the Metric<br>typedef itk::EuclideanDistancePointMetric&lt;&nbsp;&nbsp;PointSetType,&nbsp;&nbsp; PointSetType&gt;&nbsp;&nbsp;MetricType;<br>typedef MetricType::TransformType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransformBaseType;
<br>typedef TransformBaseType::ParametersType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ParametersType;<br>typedef TransformBaseType::JacobianType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JacobianType;<br><br>MetricType::Pointer&nbsp;&nbsp;metric = MetricType::New();<br><br>// Set up a Transform
<br>typedef itk::Euler3DTransform&lt; double &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransformType;<br>TransformType::Pointer transform = TransformType::New();<br><br>// Optimizer Type<br>typedef itk::LevenbergMarquardtOptimizer OptimizerType;<br>OptimizerType::Pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optimizer&nbsp;&nbsp;&nbsp;&nbsp; = OptimizerType::New();
<br>optimizer-&gt;SetUseCostFunctionGradient(false);<br><br>// Registration Method<br>typedef itk::PointSetToPointSetRegistrationMethod&lt;&nbsp;&nbsp;PointSetType, PointSetType &gt; RegistrationType;<br><br>RegistrationType::Pointer&nbsp;&nbsp; registration&nbsp;&nbsp;= RegistrationType::New();
<br>// Scale the translation components of the Transform in the Optimizer<br>OptimizerType::ScalesType scales( transform-&gt;GetNumberOfParameters() );<br><br>const double translationScale = 1000.0;&nbsp;&nbsp; // dynamic range of translations
<br>const double rotationScale&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;1.0;&nbsp;&nbsp; // dynamic range of rotations<br><br>scales[0] = 1.0 / rotationScale;<br>scales[1] = 1.0 / rotationScale;<br>scales[2] = 1.0 / rotationScale;<br>scales[3] = 1.0 / translationScale; 
<br>scales[4] = 1.0 / translationScale; <br>scales[5] = 1.0 / translationScale;<br><br>unsigned long&nbsp;&nbsp; numberOfIterations =&nbsp;&nbsp;2000;<br>double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gradientTolerance&nbsp;&nbsp;=&nbsp;&nbsp;1e-4;&nbsp;&nbsp; // convergence criterion<br>double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valueTolerance&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;1e-4;&nbsp;&nbsp; // convergence criterion
<br>double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;epsilonFunction&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;1e-5;&nbsp;&nbsp; // convergence criterion<br><br>optimizer-&gt;SetScales( scales );<br>optimizer-&gt;SetNumberOfIterations( numberOfIterations );<br>optimizer-&gt;SetValueTolerance( valueTolerance );
<br>optimizer-&gt;SetGradientTolerance( gradientTolerance );<br>optimizer-&gt;SetEpsilonFunction( epsilonFunction );<br><br>// Start from an Identity transform (in a normal case, the user <br>// can probably provide a better guess than the identity...
<br>transform-&gt;SetIdentity();<br><br>registration-&gt;SetInitialTransformParameters( transform-&gt;GetParameters() );<br><br>// Connect all the components required for Registration<br>registration-&gt;SetMetric(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;metric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
<br>registration-&gt;SetOptimizer(&nbsp;&nbsp;&nbsp;&nbsp; optimizer&nbsp;&nbsp;&nbsp;&nbsp; );<br>registration-&gt;SetTransform(&nbsp;&nbsp;&nbsp;&nbsp; transform&nbsp;&nbsp;&nbsp;&nbsp; );<br>registration-&gt;SetFixedPointSet( fixedPointSet );<br>registration-&gt;SetMovingPointSet(&nbsp;&nbsp; movingPointSet&nbsp;&nbsp; );
<br><br>try <br>{<br>&nbsp;&nbsp;registration-&gt;StartRegistration();<br>}<br>catch( itk::ExceptionObject &amp; e )<br>{<br>&nbsp;&nbsp;DisplayITKError(e);<br>&nbsp;&nbsp;return -1;<br>}<br>for(i=0; i&lt;6; i++) //first 3&quot; rotation around x, y, z; last 3: translation
<br>{<br>&nbsp;&nbsp;tResultParametre[i] = transform-&gt;GetParameters()[i];<br>}<br><br>//Transform the moving pointset into registered pointset and Write the registered points into registeredFileName<br>//========================
<br>//Method 1: Use TransformMeshFilter&lt;PointSetType, PointSetType, TransformType&gt;</div>
<div>//========================<br>//typedef itk::TransformMeshFilter&lt;PointSetType, PointSetType, TransformType&gt; TransformFilterType;<br>//TransformFilterType::Pointer transformfilter= TransformFilterType::New();<br>
//transformfilter-&gt;SetInput(movingPointSet);<br>//transformfilter-&gt;SetTransform(transform);<br>//try <br>//{<br>// transformfilter-&gt;Update();<br>//}<br>//catch( itk::ExceptionObject &amp; e )<br>//{<br>// DisplayITKError(e);
<br>// return -1;<br>//}<br>//registeredPointSet = transformfilter-&gt;GetOutput();<br>&nbsp;</div>
<div>//===========================</div>
<div>//Method 2: Use TransformPoint for each individual point</div>
<div>//===========================<br>for(i = 0; i&lt;movingPointSet-&gt;GetNumberOfPoints(); i++)<br>{<br>&nbsp;&nbsp;movingPointSet-&gt;GetPoint( i, &amp;movingPoint );<br>&nbsp;&nbsp;registeredPoint =&nbsp;&nbsp; transform-&gt;TransformPoint( movingPoint );
<br>&nbsp;&nbsp;registeredPointContainer-&gt;InsertElement( i, registeredPoint );<br>}<br>registeredPointSet-&gt;SetPoints(registeredPointContainer);<br>&nbsp;</div>
<div>//Write the registered pointset into file <br>std::ofstream&nbsp;&nbsp; registeredFile;<br>registeredFile.open( registeredFileName);<br>if( registeredFile.fail() )<br>{<br>&nbsp;&nbsp;return -1;<br>}<br>for(i = 0; i&lt;registeredPointSet-&gt;GetNumberOfPoints(); i++)
<br>{<br>&nbsp;&nbsp;registeredPointSet-&gt;GetPoint( i, &amp; registeredPoint );<br>&nbsp;&nbsp;for(j = 0; j&lt;Dimension; j++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp; registeredFile&lt;&lt;registeredPoint[j]&lt;&lt;&quot;\t&quot;;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;registeredFile&lt;&lt;endl;
<br>}<br><br>return 1;<br>}</div>
<div>===========================================</div>
<div>The error message given at the beginning of this post is&nbsp;for codes with Method 2 (Use TransformPoint() for each individual point).</div>
<div>When compiling the codes with Method 1 (Use TransformMeshFilter&lt;PointSetType, PointSetType, TransformType&gt;), the error message is:</div>
<div>Error&nbsp;1&nbsp;error C2664: &#39;itk::MatrixOffsetTransformBase&lt;TScalarType,NInputDimensions,NOutputDimensions&gt;::TransformPoint&#39; : cannot convert parameter 1 from &#39;const itk::Point&lt;TCoordRep,NPointDimension&gt;&#39; to &#39;const itk::Point&lt;TCoordRep,NPointDimension&gt; &amp;&#39;&nbsp;c:\steven\installation\itk\insighttoolkit-
3.2.0\code\basicfilters\itktransformmeshfilter.txx&nbsp;95</div>
<div>The codes around the break point in the file &quot;insighttoolkit-3.2.0\code\basicfilters\itktransformmeshfilter.txx&quot;&nbsp;are:</div>
<div>
<p>&nbsp; typename InputPointsContainer::ConstIterator&nbsp; inputPoint&nbsp; = inPoints-&gt;Begin();<br>&nbsp; typename OutputPointsContainer::Iterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputPoint = outPoints-&gt;Begin();</p>
<p>&nbsp; while( inputPoint != inPoints-&gt;End() ) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; outputPoint.Value() =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_Transform-&gt;TransformPoint( inputPoint.Value() );&nbsp; //HERE IS THE ERROR&nbsp;<br>&nbsp;&nbsp;&nbsp; ++inputPoint;<br>&nbsp;&nbsp;&nbsp; ++outputPoint;<br>&nbsp;&nbsp;&nbsp; }</p>
</div>
<div>Could you please help me on this? Thank you again.</div>
<div>&nbsp;</div>
<div>Regards,</div>
<div>Steven<br>&nbsp;</div>
<div><br>On 9/3/07, Luis Ibanez &lt;<a href="mailto:luis.ibanez@kitware.com">luis.ibanez@kitware.com</a>&gt; wrote:<br>&gt; <br>&gt; Hi Steven,<br>&gt; <br>&gt; 1) You didn&#39;t posted the full error message to the list.
<br>&gt; <br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;Apparently you cut the part where the compiler tell us what<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;[TScalarType] you used when instantiating the Transform.<br>&gt; <br>&gt; 2) Most likely you are using a transform instantiated for &quot;double&quot;,
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;and trying to use it for transforming points whose components<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;are &quot;float&quot;.<br>&gt; <br>&gt; <br>&gt; If that is the case you have two options:<br>&gt; <br>&gt; <br>&gt; A) Declare the PointSet using &quot;double&quot; at a cost in memory
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;storage. this may be fine if you are not managing thousands<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;or millions of points.<br>&gt; <br>&gt; B) Declare the Transform to use &quot;float&quot; as its ScalarType.<br>&gt; <br>&gt; <br>&gt; Option (A) is better if you care about the precision of the
<br>&gt; computations more than the memory allocation.<br>&gt; <br>&gt; <br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;Regards,<br>&gt; <br>&gt; <br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Luis<br>&gt; <br>&gt; <br>&gt; ---------------------<br>&gt; Steven ITK wrote:<br>&gt; &gt; Hi, ITK Users,
<br>&gt; &gt;<br>&gt; &gt; I have a compiling error when using TransformPoint:<br>&gt; &gt;<br>&gt; &gt; Error 1 error C2664:<br>&gt; &gt; &#39;itk::MatrixOffsetTransformBase&lt;TScalarType,NInputDimensions,NOutputDimensions&gt;::TransformPoint&#39;
<br>&gt; &gt; : *cannot convert* parameter 1 from *&#39;PointType&#39; to &#39;const<br>&gt; &gt; itk::Point&lt;TCoordRep,NPointDimension&gt; &amp;&#39; . *<br>&gt; &gt;<br>&gt; &gt; What I am trying to do is testing the example of Iterative Closest Point
<br>&gt; &gt; Registration method (PointSetToPointSetRegistrationMethod). The<br>&gt; &gt; registration is working, but I had the problem to transform the moving<br>&gt; &gt; pointset to registered pointset using the transformation matrix obtained
<br>&gt; &gt; from the reigstration.<br>&gt; &gt;<br>&gt; &gt; Here is my code:<br>&gt; &gt; //type define<br>&gt; &gt;&nbsp;&nbsp;typedef itk::PointSet&lt; float, Dimension &gt;&nbsp;&nbsp; PointSetType;<br>&gt; &gt;&nbsp;&nbsp;PointSetType::Pointer fixedPointSet&nbsp;&nbsp;= PointSetType::New();
<br>&gt; &gt;&nbsp;&nbsp;PointSetType::Pointer movingPointSet = PointSetType::New();<br>&gt; &gt;&nbsp;&nbsp;PointSetType::Pointer registeredPointSet = PointSetType::New();<br>&gt; &gt;&nbsp;&nbsp;typedef PointSetType::PointType&nbsp;&nbsp;&nbsp;&nbsp; PointType;<br>&gt; &gt;&nbsp;&nbsp;PointType fixedPoint;
<br>&gt; &gt;&nbsp;&nbsp;PointType movingPoint;<br>&gt; &gt;&nbsp;&nbsp;PointType registeredPoint;<br>&gt; &gt;&nbsp;&nbsp;typedef PointSetType::PointsContainer&nbsp;&nbsp;PointsContainer;<br>&gt; &gt;&nbsp;&nbsp;PointsContainer::Pointer fixedPointContainer&nbsp;&nbsp;= PointsContainer::New();
<br>&gt; &gt;&nbsp;&nbsp;PointsContainer::Pointer movingPointContainer = PointsContainer::New();<br>&gt; &gt;&nbsp;&nbsp;PointsContainer::Pointer registeredPointContainer = PointsContainer::New();<br>&gt; &gt;<br>&gt; &gt; //Read in moving pointset and fixed pointset
<br>&gt; &gt;<br>&gt; &gt; //do the registration<br>&gt; &gt;<br>&gt; &gt; got the transformation stored in *&#39;transform&#39;*<br>&gt; &gt;<br>&gt; &gt; // transform moving pointset<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;for(i = 0; i&lt;movingPointSet-&gt;GetNumberOfPoints(); i++)
<br>&gt; &gt;&nbsp;&nbsp;{<br>&gt; &gt;&nbsp;&nbsp; movingPointSet-&gt;GetPoint( i, &amp;movingPoint );<br>&gt; &gt;&nbsp;&nbsp; *registeredPoint =&nbsp;&nbsp; transform-&gt;TransformPoint( movingPoint<br>&gt; &gt; );//error here*<br>&gt; &gt;&nbsp;&nbsp; registeredPointContainer-&gt;InsertElement( i, registeredPoint );
<br>&gt; &gt;&nbsp;&nbsp;}<br>&gt; &gt;&nbsp;&nbsp;registeredPointSet-&gt;SetPoints(registeredPointContainer);<br>&gt; &gt;<br>&gt; &gt; ==============================================================<br>&gt; &gt; I also tried this, got the similar error:
<br>&gt; &gt;&nbsp;&nbsp;typedef itk::TransformMeshFilter&lt;PointSetType, PointSetType,<br>&gt; &gt; TransformType&gt; TransformFilterType;<br>&gt; &gt;&nbsp;&nbsp;TransformFilterType::Pointer transformfilter= TransformFilterType::New();<br>
&gt; &gt;&nbsp;&nbsp;transformfilter-&gt;SetInput(movingPointSet);<br>&gt; &gt;&nbsp;&nbsp;transformfilter-&gt;SetTransform(transform);<br>&gt; &gt;&nbsp;&nbsp;try<br>&gt; &gt;&nbsp;&nbsp;{<br>&gt; &gt;&nbsp;&nbsp; transformfilter-&gt;Update();<br>&gt; &gt;&nbsp;&nbsp;}<br>&gt; &gt;&nbsp;&nbsp;catch( itk::ExceptionObject &amp; e )
<br>&gt; &gt;&nbsp;&nbsp;{<br>&gt; &gt;&nbsp;&nbsp; DisplayITKError(e);<br>&gt; &gt;&nbsp;&nbsp; return -1;<br>&gt; &gt;&nbsp;&nbsp;}<br>&gt; &gt;&nbsp;&nbsp;registeredPointSet = transformfilter-&gt;GetOutput();<br>&gt; &gt;<br>&gt; &gt; ===============================================================
<br>&gt; &gt;<br>&gt; &gt; Can you help me out of this? Thank you.<br>&gt; &gt;<br>&gt; &gt; Steven<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; ------------------------------------------------------------------------
<br>&gt; &gt;<br>&gt; &gt; _______________________________________________<br>&gt; &gt; Insight-users mailing list<br>&gt; &gt; <a href="mailto:Insight-users@itk.org">Insight-users@itk.org</a><br>&gt; &gt; <a href="http://www.itk.org/mailman/listinfo/insight-users">
http://www.itk.org/mailman/listinfo/insight-users</a><br>&gt; <br><br>&nbsp;</div>