[vtkusers] contour widget with live wire interpolation not working

Jonathan Morra jonmorra at gmail.com
Wed Oct 27 18:32:21 EDT 2010


I have a vtkContourWidget and I wish to use a Live Wire method for drawing
the lines.  When I make a contour widget without the live wire stuff
everything looks fine.  However, when I add in the live wire stuff the line
that is connecting two control points is not being shown.  Below is a
snippet of my code that deals with the live wire part (I'm writing in Java).
 Does anyone know why this is happening?

Thanks

        vtkImageAnisotropicDiffusion3D diffusion = new
vtkImageAnisotropicDiffusion3D();
        diffusion.SetInput(imageData);

        // Gradient magnitude for edges
        vtkImageGradientMagnitude grad = new vtkImageGradientMagnitude();
        grad.SetDimensionality(3);
        grad.HandleBoundariesOn();
        grad.SetInputConnection(diffusion.GetOutputPort());
        grad.Update();

        double[] range = grad.GetOutput().GetScalarRange();

        // Invert the gradient magnitude so that low costs are
        // associated with strong edges and scale from 0 to 1
        vtkImageShiftScale gradInvert = new vtkImageShiftScale();
        gradInvert.SetShift(-1.0*range[1]);
        gradInvert.SetScale(1.0 / (range[0] - range[1]));
        gradInvert.SetOutputScalarTypeToFloat();
        gradInvert.SetInputConnection(grad.GetOutputPort());
        gradInvert.Update();
        gradInverseData = gradInvert.GetOutput();

        vtkContourWidget contourWidget = new vtkContourWidget();
        contourWidget.FollowCursorOn();

        vtkOrientedGlyphContourRepresentation rep = new
vtkOrientedGlyphContourRepresentation();
        rep.GetLinesProperty().SetLineWidth(5);
        rep.GetProperty().SetPointSize(6);
        rep.SetWorldTolerance(0.000005);

        // The contour rep requires a suitable point placer
        vtkImageActorPointPlacer placer = new vtkImageActorPointPlacer();
        placer.SetImageActor(imageViewer.GetImageActor());

        rep.SetPointPlacer(placer);
        // Reslice the data because the gradient only works in 2D
        int[] dims = imageViewer.GetImageActor().GetDisplayExtent();
        vtkImageReslice reslice = new vtkImageReslice();
        reslice.SetInput(gradDataInverse);
        reslice.SetOutputExtent(dims);
        reslice.Update();

        // The line interpolator defines how intermediate points are
        // generated between the representations nodes.  This
        // interpolator uses Dijkstra's shortest path algorithm.
        vtkDijkstraImageContourLineInterpolator interpolator = new
vtkDijkstraImageContourLineInterpolator();
        interpolator.SetCostImage(reslice.GetOutput());

        interpolator.GetDijkstraImageGeodesicPath().StopWhenEndReachedOn();
        // prevent contour segments from overlapping

 interpolator.GetDijkstraImageGeodesicPath().RepelPathFromVerticesOn();

        // weights are scaled from 0 to 1 as are associated cost
        // components

 interpolator.GetDijkstraImageGeodesicPath().SetCurvatureWeight(0.15);

 interpolator.GetDijkstraImageGeodesicPath().SetEdgeLengthWeight(0.8);
        interpolator.GetDijkstraImageGeodesicPath().SetImageWeight(1.0);

        rep.SetLineInterpolator(interpolator);
        contourWidget.SetRepresentation(rep);
        contourWidget.SetInteractor(panel.getRenWin().getIren());
        contourWidget.On();
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20101027/25a2b77a/attachment.htm>


More information about the vtkusers mailing list