Hi everyone,<br><br>I am having a strange problem with vtkImageExtrudeFilter output. The problem is that it does not also happen all the time, so I am not sure what is going on.<br><br>So, what I am trying to do is create a binary mask based on some user selection.
<br><br><span style="font-family: monospace;">The code for using the vtkImageExtrude function is as follows:<br><br></span><pre>vtkLinearExtrusionFilter* extrude = vtkLinearExtrusionFilter::New();<br>extrude->SetInput(polydata);
<br>extrude->SetScaleFactor(1);<br>extrude->SetExtrusionTypeToNormalExtrusion();<br>extrude->SetVector(0, 0, 1);<br><br>vtkPolyDataToImageStencil* dataToStencil = vtkPolyDataToImageStencil::New();<br>dataToStencil->SetInput(extrude->GetOutput());
<br><br>vtkImageStencil* stencil = vtkImageStencil::New();<br>stencil->SetInput(m_viewer->GetOutput());<br>stencil->SetStencil(dataToStencil->GetOutput());<br>stencil->ReverseStencilOff();<br>stencil->SetBackgroundValue(0);
<br><br>stencil->Update();</pre>Now, to binarize the image, I am using the code from the vtk build (thanks to Gabriel for pointing this out!) . The code can be found at:<br><br><tt><a href="http://public.kitware.com/cgi-bin/viewcvs.cgi/*checkout*/Hybrid/Testing/Cxx/TestImageStencilData.cxx?root=VTK&content-type=text/plain" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
/Hybrid/Testing/Cxx/TestImageStencilData.cxx</a><br><br>I am putting the function here also:<br><br>The code is as follows:<br> </tt><pre>static void GetStencilDataAsImageData(<br><br> vtkImageStencilData * stencilData, vtkImageData *image )
<br>{<br> int extent[6];<br> stencilData->GetExtent( extent );<br> extent[5] = extent[4]; // Otherwise we cannot write it out as a PNG!<br> int extent1[6] = {0,50,0,50,0,0};<br><br> image->SetExtent(extent1);<br>
image->SetScalarTypeToUnsignedChar();<br> image->SetNumberOfScalarComponents(3);<br> image->AllocateScalars();<br><br> // Fill image with zeroes<br> for (int y=extent1[2]; y <= extent1[3]; y++)<br><br> {
<br> unsigned char *ptr = (unsigned char *)(image->GetScalarPointer(<br> extent1[0], y, extent1[4] ));<br> for (int x=extent1[0]; x <= extent1[1]; x++)<br> {<br> *ptr = 0; ++ptr;
<br><br> *ptr = 0; ++ptr;<br> *ptr = 0; ++ptr;<br> }<br> }<br><br> vtkIdType increments[3];<br> image->GetIncrements( increments );<br><br> int iter = 0;<br> for (int y=extent1[2]; y <= extent1[3]; y++, iter = 0)
<br><br> {<br> int r1,r2;<br> int moreSubExtents = 1;<br> while( moreSubExtents )<br> {<br> moreSubExtents = stencilData->GetNextExtent(<br> r1, r2, extent1[0], extent1[1], y, extent1[4], iter);
<br><br><br> // sanity check<br> if (r1 <= r2 )<br> {<br> unsigned char *beginExtent =<br> (unsigned char *)(image->GetScalarPointer( r1, y, extent1[4] ));<br> unsigned char *endExtent =
<br><br> (unsigned char *)(image->GetScalarPointer( r2, y, extent1[4] ));<br> while (beginExtent <= endExtent)<br> {<br> *beginExtent = (unsigned char)(255);<br> *(beginExtent+1) = (unsigned char)(255);
<br><br> *(beginExtent+2) = (unsigned char)(255);<br> beginExtent += increments[0];<br> }<br> }<br> } // end for each extent tuple<br> } // end for each scan line</pre><br>The function is called as follows:
<br><br>vtkImageData * data = vtkImageData::New();<br><pre>GetStencilDataAsImageData(stencil->GetStencil(), data);<br><br>Now, the problem is that I am expecting a black background and white foreground of the my selection region. I get this most of the time but sometimes the selection is inverted!! That is my background is white and foreground is black! I have no idea why this is happening. I am guessing it could even be something with the vtkImageExtrude filter.
<br><br>Has anyone else noticed this or know what might be going on here?<br><br>Thanks fo any help you might be able to give me.<br><br>Cheers,<br></pre>
Anja