[vtk-developers] Question on designing filters

Lodron, Gerald Gerald.Lodron at joanneum.at
Wed Aug 25 05:03:14 EDT 2010


Hi

I am new in writing own vtk filters and have a question:


I want to make a vtk filter which hast two input images and one output whereby the input images can have different sizes and the output has the size of the first input.

My filter is working but when the first input is bigger than the second input i get  following Error in the output window (but the results seem to be right):
ERROR: In ..\..\Source\vtk-5.6.0\Filtering\vtkExecutive.cxx, line 378
vtkStramingDemandDrivenPipeline (0000000000002FBB4E0): Attempt to get

(i cannot read the rest because the vtkOutputWindow is deactivated, lol)

Can anyone say me what i making wrong:

here some code snippets, it would be also great if anyone can say me how to make a better type handling than the if(dim ==3), switch(datatype) stuff:


class CFilter : public vtkImageAlgorithm

{

public:

   static CFilter *New();

   void PrintSelf(ostream& oStream, vtkIndent oIndent);

protected:

   CFilter ();

   ~CFilter ();

    int RequestData(vtkInformation *poRequest, vtkInformationVector** ppoInputVector, vtkInformationVector* poOutputVector);

private:

    CFilter (CFilter &);

    void operator=(const CFilter &);

};



CFilter ::CFilter ()

{

    this->SetNumberOfInputPorts(2);

}



int

CFilter ::RequestData(vtkInformation *poRequest, vtkInformationVector** ppoInputVector, vtkInformationVector* poOutputVector)

{

   vtkInformation* oInputInfo;

   oInputInfo = ppoInputVector[0]->GetInformationObject(0);

   vtkImageData *oInput1 = vtkImageData::SafeDownCast(oInputInfo->Get(vtkDataObject::DATA_OBJECT()));

   oInputInfo = ppoInputVector[1]->GetInformationObject(0);

   vtkImageData *oInput2 = vtkImageData::SafeDownCast(oInputInfo->Get(vtkDataObject::DATA_OBJECT()));

   unsigned int iDim;

   if((oInput1->GetDataDimension() == 3) && (oInput2->GetDataDimension() == 3))

   {

       iDim = 3;

   }

   else if ((oInput1->GetDataDimension() == 2) && (oInput2->GetDataDimension() == 2))

   {

       iDim = 2;

   }

   else

   {

       std::cout << "Error: This filter requires two or three dimensional data!" << std::endl;

       return 0;

   }

   vtkInformation* oInfo = poOutputVector->GetInformationObject(0);

   vtkImageData *oOutput = vtkImageData::SafeDownCast(oInfo->Get(vtkDataObject::DATA_OBJECT()));



   int iScalarType = oInput1->GetScalarType();

   vtkSmartPointer<vtkImageCast> oInputCaster1 = vtkImageCast::New();

   oInputCaster1->ReleaseDataFlagOn();

   oInputCaster1->SetInput(oInput1);

   vtkSmartPointer<vtkImageCast> oInputCaster2 = vtkImageCast::New();

   oInputCaster2->ReleaseDataFlagOn();

   oInputCaster2->SetInput(oInput2);

   vtkSmartPointer<vtkImageCast> oOutputCaster = vtkImageCast::New();

   oOutputCaster->SetOutputScalarType(iScalarType);

   if(iDim == 2)

   {

       switch(iScalarType)

      {

           case VTK_FLOAT:

           {

               typedef itk::Image<float, 2> TInputImage;

               typedef itk::Image<float, 2> TOutputImage;

               typedef MyITKFilter<TInputImage,TOutputImage> TFilter;

               typedef itk::VTKImageToImageFilter<TInputImage> TInputConverter;

               typedef itk::ImageToVTKImageFilter<TOutputImage> TOutputConverter;

               oInputCaster1->SetOutputScalarTypeToFloat();

               oInputCaster2->SetOutputScalarTypeToFloat();

               TInputConverter::Pointer oInputConverter1 = TInputConverter::New();

               oInputConverter1->ReleaseDataFlagOn();

               oInputConverter1->SetInput(oInputCaster1->GetOutput());

               TInputConverter::Pointer oInputConverter2 = TInputConverter::New();

               oInputConverter2->ReleaseDataFlagOn();

               oInputConverter2->SetInput(oInputCaster2->GetOutput());

               TFilter::Pointer oFilter = TFilter::New();

               oFilter->SetInput1(oInputConverter1->GetOutput());

               oFilter->SetInput2(oInputConverter2->GetOutput());

               oFilter->ReleaseDataFlagOn();

               TOutputConverter::Pointer oOutputConverter = TOutputConverter::New();

               oOutputConverter->ReleaseDataFlagOn();

               oOutputConverter->SetInput(oFilter->GetOutput());

               oOutputCaster->SetInput(oOutputConverter->GetOutput());

              oOutputCaster->Update();

          }

          break;

          case VTK_UNSIGNED_CHAR:

          {

              typedef itk::Image<unsigned char, 2> TInputImage;

              typedef itk::Image<unsigned char, 2> TOutputImage;

              typedef CCheckerboard<TInputImage,TOutputImage> TFilter;

              typedef itk::VTKImageToImageFilter<TInputImage> TInputConverter;

              typedef itk::ImageToVTKImageFilter<TOutputImage> TOutputConverter;

              oInputCaster1->SetOutputScalarTypeToUnsignedChar();

              oInputCaster2->SetOutputScalarTypeToUnsignedChar();



              blablabla

         }

        //do for all cases

     }

}

else if (iDim==3)

{

//do for dim = 3 and all cases

}

}

oOutput->ShallowCopy(oOutputCaster->GetOutput());

oOutputCaster->Delete();

oInputCaster1->Delete();

oInputCaster2->Delete();

return 1;

}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20100825/40759011/attachment.html>


More information about the vtk-developers mailing list