[vtkusers] vtkobject Error trying to delete object with non zero reference count

Karthik Krishnan karthik.krishnan at kitware.com
Mon Sep 13 07:39:39 EDT 2010


I can't comment on vtkDICOMImageReader, having never used it. Its not known
to be robust in handling dicom data. Try using GDCM's (gdcm.sourceforge.net)
vtkGDCMImageReader. You can build GDCM with java wrapping.

On Mon, Sep 13, 2010 at 2:16 AM, Ali Habib <ali.mahmoud.habib at gmail.com>wrote:

> Dear Karthik
>
> thanks alot ,
>
>  it worked very well
>
> but I have another problem with the code I sent  , which is when trying to
> read large DICOm data (481 file ) it crash I use vista 32 bit , and 4 GB RAM
>
> Best regards
>
> On Sun, Sep 12, 2010 at 2:22 PM, Karthik Krishnan <
> karthik.krishnan at kitware.com> wrote:
>
>> It probably means that the object has no references holding on to it and
>> is hence destroyed by the GC. Try expanding its scope outside the function.
>>
>>
>>   On Sun, Sep 12, 2010 at 3:40 PM, Ali Habib <ali.mahmoud.habib at gmail.com
>> > wrote:
>>
>>>   Hi,
>>> I created my own pipeline to select part of *vtkboxwidget *and linear
>>> transfer it , as a source of linear deformation but the code through error
>>> :  trying to delete object with non zero reference count  at vtkobject.cxx
>>>
>>> any suggestion to solve that , the code I use is :
>>>          static vtkPolyData gpd;
>>>         static vtkLODActor selectActor;
>>>         static vtkLODActor maceActor;
>>>         static vtkLODActor selectActor_cutting;
>>>         static vtkPlanes planes;
>>>         static vtkClipPolyData clipper;
>>>         static vtkClipPolyData clipper_cutting;
>>>         // static vtkAppendPolyData apd;
>>>
>>>         static double[] center_Before = new double[3];
>>>         static double[] center_After = new double[3];
>>>
>>>         bool IsTransfer = false;
>>>
>>>  void AddInputToWindow(vtk.vtkRenderWindow renWin, bool ISFirst)
>>>         {
>>>             /* vtk.vtkSphereSource cone = new vtk.vtkSphereSource();
>>>              cone.SetRadius(1.0f);*/
>>>
>>>             vtk.vtkDICOMImageReader VDR = new vtk.vtkDICOMImageReader();
>>>             VDR.SetDirectoryName(@"E:\Master
>>> Degree\DataSet\case2\DICOM\PA1\ST1\SE2");
>>>             VDR.SetDataOrigin(0, 0, 0);
>>>             VDR.Update();
>>>
>>>             // decrease the dataset data for large data preprocessing
>>>
>>>             vtkImageShrink3D VIS = new vtkImageShrink3D();
>>>             VIS.SetShrinkFactors(2, 2, 2);
>>>             VIS.SetInputConnection(VDR.GetOutputPort());
>>>             VIS.Update();
>>>
>>>             vtkImageThreshold VIT = new vtkImageThreshold();
>>>             VIT.ThresholdBetween(200, 2000);
>>>             VIT.SetInputConnection(VIS.GetOutputPort());
>>>             VIT.Update();
>>>
>>>             ///// Start the creation of volume rendering
>>>
>>>             //1. Gget the range of data
>>>             vtk.vtkImageChangeInformation VIC = new
>>> vtk.vtkImageChangeInformation();
>>>             VIC.SetInput(VDR.GetOutput());
>>>             VIC.CenterImageOn();
>>>             VIC.Update();
>>>
>>>             vtk.vtkImageData VoxelData = new vtk.vtkImageData();
>>>             VoxelData = VIC.GetOutput();
>>>
>>>             double[] metaScalarRange = VoxelData.GetScalarRange();
>>>
>>>
>>>             // Render the skin - Soft tissue
>>>             double isovalue = 0.8 * (metaScalarRange[1] +
>>> metaScalarRange[0]);
>>>
>>>
>>>             vtkContourFilter skinExtractor = new vtkContourFilter();
>>>             skinExtractor.SetInputConnection(VIT.GetOutputPort());
>>>             skinExtractor.SetValue(0, isovalue);
>>>             skinExtractor.ComputeGradientsOn();
>>>             skinExtractor.Update();
>>>
>>>             vtkPolyDataConnectivityFilter VPDC = new
>>> vtkPolyDataConnectivityFilter();
>>>             VPDC.SetInput(skinExtractor.GetOutput());
>>>             VPDC.SetExtractionModeToLargestRegion();
>>>             VPDC.Update();
>>>
>>>             gpd = VPDC.GetOutput();
>>>
>>>             /*gpd.Register(null);
>>>             gpd.SetSource(null);*/
>>>
>>>             vtk.vtkPolyDataMapper coneMapper = new
>>> vtk.vtkPolyDataMapper();
>>>             coneMapper.SetInput(gpd);
>>>             coneMapper.ScalarVisibilityOff();
>>>
>>>             maceActor = new vtkLODActor();
>>>             maceActor.SetMapper(coneMapper);
>>>             maceActor.GetProperty().SetColor(1, 0, 0);
>>>             //////////////////////// Selection Part
>>> /////////////////////////
>>>             planes = new vtkPlanes();
>>>
>>>             clipper = new vtkClipPolyData();
>>>             clipper.SetInput(gpd);
>>>             clipper.SetClipFunction(planes);
>>>             clipper.InsideOutOn();
>>>             clipper.Modified();
>>>             vtkPolyDataMapper selectMapper = new vtkPolyDataMapper();
>>>             selectMapper.SetInput(clipper.GetOutput());
>>>             selectMapper.ScalarVisibilityOff();
>>>
>>>             selectActor = new vtkLODActor();
>>>             selectActor.SetMapper(selectMapper);
>>>             selectActor.GetProperty().SetColor(0, 1, 0);
>>>             selectActor.VisibilityOff();
>>>             selectActor.SetScale(1.01, 1.01, 1.01);
>>>
>>>             /////////////////////// End of selection
>>> part////////////////////
>>>
>>>             //////////////////////////// Cutting part
>>> /////////////////////////////////
>>>
>>>
>>>             clipper_cutting = new vtkClipPolyData();
>>>             clipper_cutting.SetInput(gpd);
>>>             clipper_cutting.SetClipFunction(planes);
>>>             clipper_cutting.InsideOutOff();
>>>             clipper_cutting.GenerateClippedOutputOff();
>>>             clipper_cutting.Modified();
>>>             vtkPolyDataMapper selectMapper_cutting = new
>>> vtkPolyDataMapper();
>>>             selectMapper_cutting.SetInput(clipper_cutting.GetOutput());
>>>             selectMapper_cutting.ScalarVisibilityOff();
>>>
>>>             selectActor_cutting = new vtkLODActor();
>>>             selectActor_cutting.SetMapper(selectMapper_cutting);
>>>             selectActor_cutting.GetProperty().SetColor(1, 0, 0);
>>>             selectActor_cutting.VisibilityOff();
>>>             selectActor_cutting.SetScale(1.01, 1.01, 1.01);
>>>
>>>             //////////////////////////// End Cutting part
>>> //////////////////////////////////////
>>>             vtk.vtkRenderer ren1 = new vtk.vtkRenderer();
>>>
>>>             renWin.AddRenderer(ren1);
>>>             //ren1.SetBackground(0.0f, 0.0f, 0.0f);
>>>
>>>             vtkRenderWindowInteractor iren = new
>>> vtkRenderWindowInteractor();
>>>             iren.SetRenderWindow(renWin);
>>>
>>>
>>>
>>>             //The SetInteractor method is how 3D widgets are associated
>>> with the
>>>             //render window interactor.  Internally, SetInteractor sets
>>> up a bunch
>>>             //of callbacks using the Command/Observer mechanism
>>> (AddObserver()).
>>>             vtkBoxWidget boxWidget = new vtkBoxWidget();
>>>             boxWidget.SetInteractor(iren);
>>>             boxWidget.SetPlaceFactor(1.25);
>>>             boxWidget.TranslationEnabledOn();
>>>
>>>
>>>
>>>             ren1.AddActor(maceActor);
>>>             ren1.AddActor(selectActor);
>>>             ren1.AddActor(selectActor_cutting);
>>>
>>>             boxWidget.SetInput(gpd);
>>>             boxWidget.PlaceWidget();
>>>
>>>
>>>  boxWidget.AddObserver((uint)vtk.EventIds.StartInteractionEvent, new
>>> vtk.vtkDotNetCallback(StartInteractionEvent));
>>>             boxWidget.AddObserver((uint)vtk.EventIds.InteractionEvent,
>>> new vtk.vtkDotNetCallback(InteractionEvent));
>>>             boxWidget.AddObserver((uint)vtk.EventIds.EndInteractionEvent,
>>> new vtk.vtkDotNetCallback(EndInteractionEvent));
>>>
>>>
>>>             boxWidget.On();
>>>
>>>
>>>             renWin.AddRenderer(ren1);
>>>
>>>             GC.Collect();
>>>         }
>>>
>>>         ///////////////////////// Observation Events
>>> ///////////////////////////////////////////////////////////////////
>>>         ///////////////////////// Observation Events
>>> ///////////////////////////////////////////////////////////////////
>>>         public void StartInteractionEvent(vtk.vtkObject obj, uint
>>> eventId, Object data, IntPtr clientdata)
>>>         {
>>>             if (IsTransfer)
>>>             {
>>>                 vtkBoxWidget widget = vtkBoxWidget.SafeDownCast(obj);
>>>
>>>                 vtkPolyData before = new vtkPolyData();
>>>                 widget.GetPolyData(before); double[] x =
>>> before.GetPoints().GetBounds();
>>>                 center_Before = GetBoundsCenter(before.GetBounds());
>>>             }
>>>
>>>
>>>         }
>>>         public void InteractionEvent(vtk.vtkObject obj, uint eventId,
>>> Object data, IntPtr clientdata)
>>>         {
>>>             vtkBoxWidget widget = vtkBoxWidget.SafeDownCast(obj);
>>>             widget.GetPlanes(planes);
>>>
>>>             clipper.Modified();
>>>             clipper_cutting.Modified();
>>>
>>>             selectActor.VisibilityOn();
>>>             selectActor_cutting.VisibilityOn();
>>>
>>>
>>>
>>>         }
>>>         public void EndInteractionEvent(vtk.vtkObject obj, uint eventId,
>>> Object data, IntPtr clientdata)
>>>         {
>>>             if (IsTransfer)
>>>             {
>>>                 vtkBoxWidget widget = vtkBoxWidget.SafeDownCast(obj);
>>>                 vtkPolyData after = new vtkPolyData();
>>>                 widget.GetPolyData(after);
>>>                 center_After = GetBoundsCenter(after.GetBounds());
>>>
>>>
>>>                 ModifyData();
>>>                 selectActor.VisibilityOff();
>>>             }
>>>
>>>
>>>         }
>>>
>>>         private double[] GetBoundsCenter(double[] bounds)
>>>         {
>>>             double[] center = new double[3];
>>>
>>>             center[0] = (bounds[0] + bounds[1]) / 2.0;
>>>             center[1] = (bounds[2] + bounds[3]) / 2.0;
>>>             center[2] = (bounds[4] + bounds[5]) / 2.0;
>>>
>>>             return center;
>>>         }
>>>
>>>         private void ModifyData()
>>>         {
>>>             //////////////////////////////////////////////////////Just
>>> sugesstion ///////////////////////
>>>
>>>
>>>             double[] Displacement = { center_After[0] - center_Before[0],
>>> center_After[1] - center_Before[1], center_After[2] - center_Before[2] };
>>>
>>>             int NoOfPoints = clipper.GetOutput().GetNumberOfPoints();
>>>
>>>             for (int i = 0; i < NoOfPoints; i++)
>>>             {
>>>                 // get the point data from the clipper
>>>                 double[] ci =
>>> clipper.GetOutput().GetPoints().GetPoint(i);
>>>                 // get the index of the original data point.
>>>                 int pxi = gpd.FindPoint(ci);
>>>                 // get the value of the poly  data point.
>>>                 double[] ppi = gpd.GetPoints().GetPoint(pxi);
>>>                 // transpose the point
>>>                 ppi[0] += Displacement[0];
>>>                 ppi[1] += Displacement[1];
>>>                 ppi[2] += Displacement[2];
>>>                 // replace the point in the poly data
>>>                 gpd.GetPoints().InsertPoint(pxi, ppi);
>>>             }
>>>             // mark the poly data as modified for the render processing.
>>>
>>>
>>>             /*gpd.Register(null);
>>>             gpd.SetSource(null);*/
>>>
>>>             gpd.Modified();
>>>             GC.Collect();
>>>         }
>>>
>>> Best regards
>>>
>>>
>>> _______________________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Please keep messages on-topic and check the VTK FAQ at:
>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20100913/53514e6c/attachment.htm>


More information about the vtkusers mailing list