[vtkusers] vtkImageTracerWidget ROI Problem
    Sercani 
    sercanimailgroups at gmail.com
       
    Tue Mar  3 16:02:53 EST 2009
    
    
  
Hi everyone;
I have a problem with vtkImageTracerWidget (i think).I am developing a multi
planar reconstitution project for CT datasets using vtk and java.I want to
draw a closed region on a vtkImageActor and then calculate the voxel count,
min , max scalar values in this region and the density of this region.I' ve
implemented the class below , but something goes wrong here so sometimes the
output of the textactor becomes: 
"n:0
min:1.0E299 HU
max:-1.0E299 HU
mean:0.0 HU
den:0.0 mm^3"
Sometimes it shows some other values, but i am not sure the accuracy of
them.I tried every possible combination with vtkExtractVOI,
vtkLinearExtrusionFilter etc. but couldn't manage to fix this.What is wrong
with this code? :
(Panel is an instance of vtkCanvas, and reslice is the active
vtkImageReslice)
 
 
import client3d.MPRPanel;
import vtk.vtkExtractVOI;
import vtk.vtkImageAccumulate;
import vtk.vtkImageStencil;
import vtk.vtkImageTracerWidget;
import vtk.vtkLinearExtrusionFilter;
import vtk.vtkPolyData;
import vtk.vtkPolyDataToImageStencil;
import vtk.vtkTextActor;
import vtk.vtkTextProperty;
 
public class DensityWidget {
 
    private vtkImageTracerWidget itw;
    private vtkExtractVOI extract;
    private vtkLinearExtrusionFilter extrude;
    private MPRPanel panel;
    private vtkPolyData poly;
    vtkImageStencil stencil;
    private double[] range;
    private double min;
    private double max;
    private double diff;
    private double avg;
    private double[] bounds;
    private vtkImageAccumulate accum;
    private vtkTextActor textActor;
    java.text.DecimalFormat df = new java.text.DecimalFormat("#00.0");
 
    public DensityWidget(MPRPanel panel) {
        this.panel = panel;
        itw = new vtkImageTracerWidget();
        extract = new vtkExtractVOI();
        extrude = new vtkLinearExtrusionFilter();
        poly = new vtkPolyData();
        stencil = new vtkImageStencil();
        accum = new vtkImageAccumulate();
        textActor = new vtkTextActor();
        createVTKPipeline();
    }
 
    public void createVTKPipeline() {
        extract.SetVOI(panel.getReslice().GetOutputExtent());
        extract.SetSampleRate(1, 1, 1);
        extract.SetInput(panel.getImagedata());
        extract.ReleaseDataFlagOff();
        extract.Update();
 
        this.range = extract.GetOutput().GetScalarRange();
        this.min = range[0];
        this.max = range[1];
        this.diff = max - min;
        this.avg = (max + min) * 0.5;
        this.bounds = extract.GetOutput().GetBounds();
 
        itw.SetCaptureRadius(100000);
        itw.GetGlyphSource().SetColor(1, 0, 0);
        itw.GetGlyphSource().SetScale(3.0);
        itw.GetGlyphSource().SetRotationAngle(45.0);
        itw.GetGlyphSource().Modified();
        itw.ProjectToPlaneOn();
        itw.SetProjectionNormalToZAxes();
        itw.SetViewProp(panel.getImageactor());
        itw.SetInput(panel.getImagedata());
        itw.SetInteractor(panel.getIren());
        itw.PlaceWidget();
        itw.SnapToImageOn();
        itw.AutoCloseOn();
        itw.AddObserver("EndInteractionEvent", this, "AdjustROI");
        itw.On();
 
        extrude.SetScaleFactor(1);
        extrude.SetExtrusionTypeToNormalExtrusion();
        extrude.SetVector(0, 0, 1);
 
        stencil.SetInputConnection(extract.GetOutputPort());
        stencil.ReverseStencilOff();
        stencil.SetBackgroundValue(128);
 
        accum.SetInputConnection(extract.GetOutputPort());
        accum.ReverseStencilOff();
        accum.SetComponentSpacing(1, 0, 0);
        accum.SetComponentExtent(0, (int) diff, 0, 0, 0, 0);
        accum.SetComponentOrigin(min, 0, 0);
        accum.ReleaseDataFlagOff();
        accum.ReverseStencilOff();
        accum.IgnoreZeroOff();
 
        vtkTextProperty prop = new vtkTextProperty();
        prop.SetFontSize(10);
        prop.SetFontFamilyToArial();
        prop.BoldOff();
        prop.ItalicOff();
        prop.ShadowOff();
        prop.SetLineSpacing(0.9);
        prop.SetJustificationToLeft();
        prop.SetVerticalJustificationToTop();
        prop.SetColor(1, 1, 0);
        textActor.ScaledTextOff();
        textActor.SetPosition(100, 40);
        textActor.SetTextProperty(prop);
 
        panel.GetRenderer().AddActor(textActor);
        panel.resetCameraClippingRange();
        panel.Render();
    }
 
    public void AdjustROI() {
 
        int closed = itw.IsClosed();
        if (closed == 1) {
            itw.GetPath(poly);
 
            extrude.SetInput(poly);
            extrude.Update();
 
            vtkPolyDataToImageStencil dataToStencil = new
vtkPolyDataToImageStencil();
            dataToStencil.SetInputConnection(extrude.GetOutputPort());
 
dataToStencil.SetOutputSpacing(extract.GetOutput().GetSpacing());
            dataToStencil.SetOutputOrigin(extract.GetOutput().GetOrigin());
 
dataToStencil.SetOutputWholeExtent(extract.GetOutput().GetExtent());
            dataToStencil.Update();
 
            stencil.SetStencil(dataToStencil.GetOutput());
            stencil.Update();
 
            accum.SetStencil(stencil.GetStencil());
            accum.Update();
            int aN = accum.GetVoxelCount();
            double amin[] = accum.GetMin();
            double amax[] = accum.GetMax();
            double amean[] = accum.GetMean();
            double den = Math.abs(amean[0]) * panel.getSpacing()[0] *
panel.getSpacing()[1] * panel.getSpacing()[2];
            String atext = "";
            atext += "n:";
            atext += aN;
            atext += "\n";
            atext += "min:" + /*df.format*/ (amin[0]) + " HU";
            atext += "\n";
            atext += "max:" + /*df.format*/ (amax[0]) + " HU";
            atext += "\n";
            atext += "mean:" + /*df.format*/ (amean[0]) + " HU";
            atext += "\n";
            atext += "den:" + /*df.format*/ (den) + " mm^3";
            System.out.println(atext);
            textActor.SetInput(atext);
            textActor.Modified();
            textActor.SetPosition(150, 60);
        } else {
            textActor.SetInput("no ROI");
        }
        panel.Render();
    }
 
    public void destroy() {
        itw.Off();
        textActor.VisibilityOff();
        extract.Delete();
        extrude.Delete();
        stencil.Delete();
        accum.Delete();
        textActor.Delete();
        itw.Delete();
    }
}
 
Thanks;
 
Sercan..
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20090303/5966723a/attachment.htm>
    
    
More information about the vtkusers
mailing list