[ITK-users] Problem with Callback function
vishal
itkhelpacc at gmail.com
Mon Jan 11 00:15:34 EST 2016
hi,
Im trying to printout the rotation values(rotation abt x,y,z) of a volume
using callback function... im follwing the example
[1]http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/ClientData ....
the flow of mycode goes something like this..
read 3D volume in ITK--> Visualize in VTK(using
itkImageToVTKImageFilter.h)--> interact with volume -> upon press any key
through callbackFunction called and using volume->GetOrientation() method in
the callback function....I can get the angles values-> print to console...
upon building the example code the radius was printed out ... but then i did
some changes so that it matches my requirements the angles are not printed
out... no errors were found during building
the code is found below->
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkSphereSource.h>
#include <vtkCallbackCommand.h>
#include <vtkCommand.h>
////////////////////////////
#include <itkImageFileReader.h>
#include "itkImageToVTKImageFilter.h"
#include <vtkSmartPointer.h>
#include <vtkGPUVolumeRayCastMapper.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVolumeProperty.h>
#include <vtkMatrix4x4.h>
#include <vtkAxesActor.h>
#include "vtkSmartVolumeMapper.h"
#include <vtkImageActor.h>
#include <vtkImageMapper3D.h>
#include <vtkImageCast.h>
#include <vtkDICOMImageReader.h>
#include <vtkTransform.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkObjectFactory.h>
///////////////////////////
static void KeypressCallbackFunction ( vtkObject* caller, long unsigned int
eventId,
void* clientData, void* callData );
double printOrient[3];
double org[3];
int main(int argc, char *argv[])
{
argv[1] ="OS_Volume.dcm"; // 3D volume that i want to display
typedef itk::Image<signed short, 3> VisualizingImageType;
typedef itk::ImageFileReader< VisualizingImageType > ReaderType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName( argv[1] );
reader->Update();
VisualizingImageType::Pointer image=reader->GetOutput();
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
ren1->SetBackground(0.5f,0.5f,1.0f);
renWin->AddRenderer(ren1);
renWin->SetSize(1280,1024);
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
renWin->Render(); // make sure we have an OpenGL context.
typedef itk::ImageToVTKImageFilter<VisualizingImageType>
itkVtkConverter;
itkVtkConverter::Pointer conv=itkVtkConverter::New();
conv->SetInput(image);
conv->Update();
vtkSmartPointer<vtkImageData>
image2=vtkSmartPointer<vtkImageData>::New();
image2->ShallowCopy(conv->GetOutput());
//shallow copy is vtk's equivalent of disconnect pipeline
vtkSmartPointer<vtkSmartVolumeMapper> volumeMapper =
vtkSmartPointer<vtkSmartVolumeMapper>::New();
volumeMapper->SetInputData(image2);
vtkSmartPointer<vtkVolumeProperty> volumeProperty =
vtkSmartPointer<vtkVolumeProperty>::New();
vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =
vtkSmartPointer<vtkPiecewiseFunction>::New();
compositeOpacity->AddPoint(-3024, 0, 0.5, 0.0 );
compositeOpacity->AddPoint(-16, 0, .49, .61 );
compositeOpacity->AddPoint(641, .72, .5, 0.0 );
compositeOpacity->AddPoint(3071, .71, 0.5, 0.0);
volumeProperty->SetScalarOpacity(compositeOpacity);
volumeMapper->SetBlendModeToComposite();
vtkSmartPointer<vtkColorTransferFunction> color =
vtkSmartPointer<vtkColorTransferFunction>::New();
color->AddRGBPoint( -3024, 0, 0, 0, 0.5, 0.0 );
color->AddRGBPoint( -16, 0.73, 0.25, 0.30, 0.49, .61 );
color->AddRGBPoint( 641, .90, .82, .56, .5, 0.0 );
color->AddRGBPoint( 3071, 1, 1, 1, .5, 0.0 );
volumeProperty->SetColor(color);
//changes
volumeProperty->SetInterpolationTypeToLinear();
volumeProperty->ShadeOn();
volumeProperty->SetAmbient(0.1);
volumeProperty->SetDiffuse(0.9);
volumeProperty->SetSpecular(0.2);
volumeProperty->SetSpecularPower(10.0);
volumeProperty->SetScalarOpacityUnitDistance(0.8919);
vtkSmartPointer<vtkVolume> volume =
vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
volume->SetScale(1.5);
//Here we take care of position and orientation
//so that volume is in DICOM patient physical space
VisualizingImageType::DirectionType d=image->GetDirection();
vtkMatrix4x4 *mat=vtkMatrix4x4::New(); //start with identity matrix
for (int i=0; i<3; i++)
for (int k=0; k<3; k++)
mat->SetElement(i,k, d(i,k));
//counteract the built-in translation by origin
VisualizingImageType::PointType origin=image->GetOrigin();
volume->SetPosition(-origin[0], -origin[1], -origin[2]);
//add translation to the user matrix
for (int i=0; i<3; i++)
mat->SetElement(i,3, origin[i]);
volume->SetUserMatrix(mat);
vtkSmartPointer<vtkCallbackCommand> keypressCallback =
vtkSmartPointer<vtkCallbackCommand>::New();
// // Allow the observer to access the sphereSource
keypressCallback->SetClientData(volume);
keypressCallback->SetCallback(KeypressCallbackFunction );
renWin->AddObserver(vtkCommand::KeyPressEvent, keypressCallback);
//Add coordinate system axes, so we have a reference for position and
orientation
vtkSmartPointer<vtkAxesActor> axes =
vtkSmartPointer<vtkAxesActor>::New();
axes->SetTotalLength(250,250,250); //ORIGINAL
axes->SetShaftTypeToCylinder();
axes->SetCylinderRadius(0.01);
ren1->AddActor(axes);
ren1->AddVolume( volume );
ren1->ResetCamera();
renWin->Render();
iren->Start();
return EXIT_SUCCESS;
}
void KeypressCallbackFunction(vtkObject *, long unsigned int
vtkNotUsed(eventId), void* clientData, void* vtkNotUsed(callData) )
{
// Prove that we can access the sphere source
vtkVolume* volume =
static_cast<vtkVolume*>(clientData);
volume->GetOrigin(org);
volume->GetOrientation(printOrient);
std::cout << "Radius is " << printOrient[1]<<" "<<printOrient[2]<<"
"<<printOrient[3]<< std::endl;
std::cout << "ORGIN" << org[1]<<" "<<org[2]<<" "<<org[3]<< std::endl;
}
please help me out
Regards
Vishal
--
View this message in context: http://itk-users.7.n7.nabble.com/Problem-with-Callback-function-tp36638.html
Sent from the ITK - Users mailing list archive at Nabble.com.
More information about the Insight-users
mailing list