<div dir="ltr">Hello,<br><br>I&#39;m trying to use the active shape model implementations which is part of ITK. In the later part of my email I attached my code, which compiles fine and runs with our crashed, but I do not get any usable results back. Which means the code does return a shape but it does not match anything in the image (wich is basically an unkown instance).&nbsp; For the training part, it does return a valid mean shape. I was hopping that somebody maybe can help here, who may know more about the itk asm implmentation.<br>
<br>Thank You Peter<br><br><br>#if defined(_MSC_VER)<br>#pragma warning ( disable : 4786 )<br>#endif<br><br>#ifdef __BORLANDC__<br>#define ITK_LEAN_AND_MEAN<br>#endif<br><br><br>#include &quot;itkActiveShapeModelCalculator.h&quot;<br>
#include &quot;itkActiveShapeModelGradientSearchMethod.h&quot;<br><br>#include &quot;itkImage.h&quot;<br>#include &quot;itkImageFileReader.h&quot;<br>#include &quot;itkImageFileWriter.h&quot;<br>#include &quot;itkImageSeriesReader.h&quot;<br>
#include &quot;itkNumericSeriesFileNames.h&quot;<br>#include &quot;itkPNGImageIO.h&quot;<br>#include &quot;itkArray.h&quot;<br><br>#include &lt;stdio.h&gt;<br>#include &lt;math.h&gt;<br>#include &lt;cstdlib&gt; <br>#include &lt;ctime&gt; <br>
#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br><br>using namespace std;<br><br>// ASM Calculator<br>// input: binary volume containing the training shapes<br>// output: mean shape, eigenvectors, eigenvalues<br><br>
int main( int argc, char * argv[] )<br>{<br><br>&nbsp;&nbsp;&nbsp; typedef itk::Image&lt; unsigned char, 3 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageType;<br>&nbsp;&nbsp;&nbsp; typedef itk::ImageFileReader&lt; ImageType &gt;&nbsp;&nbsp; ReaderType;<br><br>&nbsp;&nbsp;&nbsp; ReaderType::Pointer reader = ReaderType::New();<br>
&nbsp;&nbsp;&nbsp; reader-&gt;SetFileName( argv[1] );<br><br>&nbsp;&nbsp;&nbsp; typedef itk::ActiveShapeModelCalculator&lt; ImageType &gt;ASMCalculatorType;<br>&nbsp;&nbsp;&nbsp; ASMCalculatorType::Pointer asm_calculator = ASMCalculatorType::New();<br><br>&nbsp;&nbsp;&nbsp; asm_calculator-&gt;SetImage( reader-&gt;GetOutput() );<br>
&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Tolerance &quot; &lt;&lt; asm_calculator-&gt;GetTolerance() &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; //asm_calculator-&gt;SetTolerance(0);<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; asm_calculator-&gt;GenerateData();<br>
&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch ( itk::ExceptionObject &amp; err )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Exception Object caught!&quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; err &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>
&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; std::cout&lt;&lt;std::endl;<br>&nbsp;&nbsp;&nbsp; asm_calculator-&gt;Print( std::cout );<br>&nbsp;&nbsp;&nbsp; std::cout&lt;&lt;std::endl;<br><br>&nbsp;&nbsp;&nbsp; itk::Array&lt;double&gt; meanShape;<br>&nbsp;&nbsp;&nbsp; meanShape = asm_calculator-&gt;GetMeanShape();<br>
&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;MeanShape &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;NumberofElements &quot; &lt;&lt; meanShape.GetNumberOfElements() &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; for ( unsigned int i=0; i&lt;meanShape.GetNumberOfElements(); i++ )<br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cout &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; meanShape.GetElement(i) &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; double **meanShapeIM = new double *[256];<br>&nbsp;&nbsp;&nbsp; for(int i=0; i &lt; 256; i++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; meanShapeIM[i] = new double [256];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int j=0; j &lt; 256; j++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; meanShapeIM[i][j] = 0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; for ( unsigned int i=0; i&lt;meanShape.GetNumberOfElements(); i = i + 2 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; meanShapeIM[(int)meanShape.GetElement(i)][(int)meanShape.GetElement(i+1)] = 255;<br>
&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; fstream out(&quot;meanShape.raw&quot;, ios::out | ios::binary);<br>&nbsp;&nbsp;&nbsp; for(int x=0;x&lt;256;x++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int z=0;z&lt;256;z++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.write((char*)&amp;meanShapeIM[z][x], sizeof(double));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; out.close();<br><br>&nbsp;&nbsp;&nbsp; itk::Array&lt;double&gt; Eigenvalues;<br>&nbsp;&nbsp;&nbsp; Eigenvalues = asm_calculator-&gt;GetEigenvalues();<br>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Eigenvalues &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;NumberofElements &quot; &lt;&lt; Eigenvalues.GetNumberOfElements() &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp; for ( unsigned int i=0; i&lt;Eigenvalues.GetNumberOfElements(); i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cout &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; Eigenvalues.GetElement(i) &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; typedef vnl_matrix&lt;double&gt; MatrixOfDoubleType;<br>
&nbsp;&nbsp;&nbsp; MatrixOfDoubleType Eigenvector = asm_calculator-&gt;GetEigenvector();<br>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Eigenvectors: &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; for ( unsigned int i = 0; i &lt; Eigenvalues.GetNumberOfElements(); ++i )<br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cout &lt;&lt; Eigenvector.get_row( i ) &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; }<br>getchar();<br>&nbsp;&nbsp;&nbsp; typedef itk::Image&lt; char, 2 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Image2D;<br>&nbsp;&nbsp;&nbsp; typedef itk::ActiveShapeModelGradientSearchMethod&lt; Image2D &gt;ASMFinderType;<br>
&nbsp;&nbsp;&nbsp; ASMFinderType::Pointer asm_finder = ASMFinderType::New();<br><br>&nbsp;&nbsp;&nbsp; typedef itk::ImageFileReader&lt; Image2D &gt;&nbsp;&nbsp; Reader2DType;<br><br>&nbsp;&nbsp;&nbsp; Reader2DType::Pointer reader2D = Reader2DType::New();<br>&nbsp;&nbsp;&nbsp; reader2D-&gt;SetFileName( argv[2] );<br>
&nbsp;&nbsp;&nbsp; reader2D-&gt;Update();<br><br>&nbsp;&nbsp;&nbsp; asm_finder-&gt;SetImage( reader2D-&gt;GetOutput() );<br><br>&nbsp;&nbsp;&nbsp; asm_finder-&gt;SetMeanShape( asm_calculator-&gt;GetMeanShape() );<br>&nbsp;&nbsp;&nbsp; asm_finder-&gt;SetEigenValues( asm_calculator-&gt;GetEigenvalues() );<br>
&nbsp;&nbsp;&nbsp; asm_finder-&gt;SetEigenVectors( asm_calculator-&gt;GetEigenvector() );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; asm_finder-&gt;Modified();<br>&nbsp;&nbsp;&nbsp; std::cout&lt;&lt;std::endl;<br>&nbsp;&nbsp;&nbsp; asm_finder-&gt;Print( std::cout );<br>&nbsp;&nbsp;&nbsp; std::cout&lt;&lt;std::endl;<br>
<br>&nbsp;&nbsp;&nbsp; asm_finder-&gt;GenerateData();<br><br>&nbsp;&nbsp;&nbsp; asm_finder-&gt;Print( std::cout );<br><br>&nbsp;&nbsp;&nbsp; itk::Array&lt;double&gt; Shape;<br>&nbsp;&nbsp;&nbsp; Shape = asm_finder-&gt;GetNewShape();<br>&nbsp;&nbsp;&nbsp; for ( unsigned int i=0; i&lt;Shape.GetNumberOfElements(); i++ )<br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //std::cout &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; Shape.GetElement(i) &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; char **ShapeIM = new char *[256];<br>&nbsp;&nbsp;&nbsp; for(int i=0; i &lt; 256; i++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ShapeIM[i] = new char [256];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int j=0; j &lt; 256; j++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ShapeIM[i][j] = 0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; for ( unsigned int i=0; i&lt;meanShape.GetNumberOfElements(); i = i + 2 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ShapeIM[(int)Shape.GetElement(i)][(int)Shape.GetElement(i+1)] = 128;<br>
&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; fstream out1(&quot;finalShape.raw&quot;, ios::out | ios::binary);<br>&nbsp;&nbsp;&nbsp; for(int x=0;x&lt;256;x++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int z=0;z&lt;256;z++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out1.write((char*)&amp;ShapeIM[z][x], sizeof(char));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; out1.close();<br><br><br>&nbsp;&nbsp;&nbsp; return EXIT_SUCCESS;<br>}<br><br></div>