[vtkusers] Picking Pixel Error
    Xiaopeng Yang 
    yxp233 at postech.ac.kr
       
    Mon Oct 11 09:19:23 EDT 2010
    
    
  
Dear users and developers,
 
Greetings!
 
I modified the "PickPixel" example so that a CT image can be loaded through
ITK and then passed to VTK. After that the picking pixel function is applied
to that image to obtain position of a pixel so that the position value can
be input to a segmentation algorithm as seed point. However, I got wrong
position values. The same thing happened to the intensity value of that
pixel.
 
Could you please tell me what happened? Attached please find my code.
 
Thanks very much.
 
#include <vtkAssemblyPath.h>
#include <vtkCell.h>
#include <vtkCommand.h>
#include <vtkCornerAnnotation.h>
#include <vtkImageActor.h>
#include <vtkImageData.h>
#include <vtkImageViewer2.h>
#include <vtkInteractorStyleImage.h>
#include <vtkJPEGReader.h>
#include <vtkPointData.h>
#include <vtkPropPicker.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkTextProperty.h>
 
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageToVTKImageFilter.h"
 
// The mouse motion callback, to pick the image and recover pixel values
class vtkImageInteractionCallback1 : public vtkCommand
{
public:
 
  static vtkImageInteractionCallback1 *New() 
    {
    return new vtkImageInteractionCallback1; 
    }
 
  vtkImageInteractionCallback1() 
    {
    this->Viewer = 0;
    this->Picker = 0;
    this->Annotation = 0;
    this->PointData = vtkPointData::New();
    }
 
  ~vtkImageInteractionCallback1()
     {
     this->Viewer = 0;
     this->Picker = 0;
     this->Annotation = 0;
     this->PointData->Delete();
     }
 
  void SetPicker(vtkPropPicker *picker) 
    {
    this->Picker = picker; 
    }
 
  void SetAnnotation(vtkCornerAnnotation *annotation) 
    {
    this->Annotation = annotation; 
    }
 
  void SetViewer(vtkImageViewer2 *viewer) 
    {
    this->Viewer = viewer; 
    }
 
    virtual void Execute(vtkObject *, unsigned long vtkNotUsed(event), void
*)
      {
      //this->Viewer;
      vtkRenderWindowInteractor *interactor =
        this->Viewer->GetRenderWindow()->GetInteractor();
      vtkRenderer* renderer = this->Viewer->GetRenderer();
      vtkImageActor* actor = this->Viewer->GetImageActor();
      vtkImageData* image = this->Viewer->GetInput();
      vtkInteractorStyle *style = vtkInteractorStyle::SafeDownCast(
          interactor->GetInteractorStyle());
 
      image->Update();
 
      // Pick at the mouse location provided by the interactor
      this->Picker->Pick( interactor->GetEventPosition()[0],
                          interactor->GetEventPosition()[1],
                          0.0, renderer );
 
      // There could be other props assigned to this picker, so 
      // make sure we picked the image actor
      vtkAssemblyPath* path = this->Picker->GetPath();
      bool validPick = false;
 
      if( path )
        {
        vtkCollectionSimpleIterator sit;
        path->InitTraversal( sit );
        vtkAssemblyNode *node;
        for( int i = 0; i < path->GetNumberOfItems() && !validPick; ++i )
          {
          node = path->GetNextNode( sit );
          if( actor == vtkImageActor::SafeDownCast( node->GetViewProp() ) )
            {
            validPick = true;
            }
          }
        }
 
      if( !validPick )
        {
        this->Annotation->SetText( 0, "Off Image" );
        interactor->Render();
        // Pass the event further on
        style->OnMouseMove();
        return;
        }
 
      // Get the world coordinates of the pick
      double pos[3];
      this->Picker->GetPickPosition( pos );
      // Fixes some numerical problems with the picking
      double *bounds = actor->GetDisplayBounds();
      int axis = this->Viewer->GetSliceOrientation();
      pos[axis] = bounds[2*axis];
 
      vtkPointData* pd = image->GetPointData();
      if( !pd )
        {
        return;
        }
 
      this->PointData->InterpolateAllocate( pd, 1, 1 );
 
      // Use tolerance as a function of size of source data
      double tol2 = image->GetLength();
      tol2 = tol2 ? tol2*tol2 / 1000.0 : 0.001;
 
      // Find the cell that contains pos
      int subId;
      double pcoords[3], weights[8];
      vtkCell* cell = image->FindAndGetCell(
          pos, NULL, -1, tol2, subId, pcoords, weights );
      if( cell )
        {
        // Interpolate the point data
        this->PointData->InterpolatePoint( pd, 0, cell->PointIds, weights );
        int components =
          this->PointData->GetScalars()->GetNumberOfComponents();
        double* tuple = this->PointData->GetScalars()->GetTuple( 0 );
 
        std::string message = "Location: ( ";
        message += vtkVariant( pos[0] ).ToString();
        message += ", ";
        message += vtkVariant( pos[1] ).ToString();
        message += ", ";
        message += vtkVariant( pos[2] ).ToString();
        message += " )\nValue: ( ";
 
        for( int c = 0; c < components; ++c )
          {
          message += vtkVariant( tuple[ c ] ).ToString();
          if( c != components - 1 ) 
            {
            message += ", ";
            }
          }
        message += " )";
        this->Annotation->SetText( 0, message.c_str() );
        interactor->Render();
        style->OnMouseMove();
        }
    }
 
private:
 
  // Pointer to the viewer
  vtkImageViewer2 *Viewer;
 
  // Pointer to the picker
  vtkPropPicker *Picker;
 
  // Pointer to the annotation
  vtkCornerAnnotation *Annotation;
 
  // Interpolator
  vtkPointData* PointData;
};
 
 
int main ( int argc, char* argv[] )
{
 
  typedef    float    InputPixelType;
  typedef itk::Image< InputPixelType,  2 >   InputImageType;
 
  typedef itk::ImageFileReader< InputImageType >     ReaderType;
  typedef itk::ImageToVTKImageFilter<InputImageType>FilterType;
 
  ReaderType::Pointer reader = ReaderType::New();
  FilterType::Pointer connector = FilterType::New();
 
  reader->SetFileName ("C:/Users/Public/Pictures/Sample
Pictures/KDJportal0122.dcm");
  connector->SetInput(reader->GetOutput());
 
  // Picker to pick pixels
  vtkSmartPointer<vtkPropPicker> propPicker =
    vtkSmartPointer<vtkPropPicker>::New();
  propPicker->PickFromListOn();
 
  // Give the picker a prop to pick
  vtkSmartPointer<vtkImageViewer2> imageViewer =
    vtkSmartPointer<vtkImageViewer2>::New();
  propPicker->AddPickList( imageViewer->GetImageActor() );
 
  // Visualize
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  imageViewer->SetInput(connector->GetOutput()); 
  imageViewer->SetupInteractor( renderWindowInteractor );
  imageViewer->SetSize( 600, 600 );
 
  vtkRenderer* renderer = imageViewer->GetRenderer();
  renderer->ResetCamera();
  renderer->GradientBackgroundOn();
  renderer->SetBackground(0,0,0);
  renderer->SetBackground2(1,1,1);
 
  // Annotate the image with window/level and mouse over pixel information
  vtkSmartPointer<vtkCornerAnnotation> cornerAnnotation =
    vtkSmartPointer<vtkCornerAnnotation>::New();
  cornerAnnotation->SetLinearFontScaleFactor( 2 );
  cornerAnnotation->SetNonlinearFontScaleFactor( 1 );
  cornerAnnotation->SetMaximumFontSize( 20 );
  cornerAnnotation->SetText( 0, "Off Image" );
  cornerAnnotation->SetText( 3, "<window>\n<level>" );
  cornerAnnotation->GetTextProperty()->SetColor( 1,0,0);
 
  imageViewer->GetRenderer()->AddViewProp( cornerAnnotation );
 
  // Callback listens to MouseMoveEvents invoked by the interactor's style
  vtkSmartPointer<vtkImageInteractionCallback1> callback =
    vtkSmartPointer<vtkImageInteractionCallback1>::New();
  callback->SetViewer( imageViewer );
  callback->SetAnnotation( cornerAnnotation );
  callback->SetPicker( propPicker );
 
  // InteractorStyleImage allows for the following controls:
  // 1) middle mouse + move = camera pan
  // 2) left mouse + move = window/level
  // 3) right mouse + move = camera zoom
  // 4) middle mouse wheel scroll = zoom
  // 5) 'r' = reset window/level
  // 6) shift + 'r' = reset camera
  vtkInteractorStyleImage* imageStyle = imageViewer->GetInteractorStyle();
  imageStyle->AddObserver( vtkCommand::MouseMoveEvent, callback );
 
  renderWindowInteractor->Initialize();
  renderWindowInteractor->Start();
 
  return EXIT_SUCCESS;
}
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20101011/9894227c/attachment.htm>
    
    
More information about the vtkusers
mailing list