- CMakeLists.txt
find_package 里面要有 VTK REQUIRED 和 ITK REQUIRED
include包含${VTK_USE_FILE} 和${ITK_USE_FILE}
联合编程主要要包含itkImageToVTKImageFilter.h该文件,在下面中贴出。
cmake_minimum_required(VERSION 2.8) project(RayCast) find_package(VTK REQUIRED) find_package( ITK REQUIRED ) include(${VTK_USE_FILE} ) INCLUDE( ${ITK_USE_FILE} ) add_executable(RayCastInstall RayCast.cxx itkImageToVTKImageFilter.h) target_link_libraries(RayCastInstall ${VTK_LIBRARIES} ${ITK_LIBRARIES})
- 除了自己的 .cxx文件以外还需要itkImageToVTKImageFilter.h,该文件在InsightToolkit-4.7.2里面。在此贴出该文件。
/*========================================================================= * * Copyright Insight Software Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef __itkImageToVTKImageFilter_h #define __itkImageToVTKImageFilter_h #include "itkVTKImageExport.h" #include "vtkImageImport.h" #include "vtkImageData.h" namespace itk { /** \class ImageToVTKImageFilter * \brief Converts an ITK image into a VTK image and plugs a * itk data pipeline to a VTK datapipeline. * * This class puts together an itkVTKImageExporter and a vtkImageImporter. * It takes care of the details related to the connection of ITK and VTK * pipelines. The User will perceive this filter as an adaptor to which * an itk::Image can be plugged as input and a vtkImage is produced as * output. * * \ingroup ITKVtkGlue * * \wiki * \wikiexample{IO/ImageToVTKImageFilter,Display an ITK image} * \wikiexample{IO/itkVtkImageConvertDICOM,Uses a custom user matrix to align the image with DICOM physical space} * \endwiki */ template <typename TInputImage > class ImageToVTKImageFilter : public ProcessObject { public: /** Standard class typedefs. */ typedef ImageToVTKImageFilter Self; typedef ProcessObject Superclass; typedef SmartPointer<Self> Pointer; typedef SmartPointer<const Self> ConstPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); /** Run-time type information (and related methods). */ itkTypeMacro(ImageToVTKImageFilter, ProcessObject); /** Some typedefs. */ typedef TInputImage InputImageType; typedef typename InputImageType::ConstPointer InputImagePointer; typedef VTKImageExport< InputImageType> ExporterFilterType; typedef typename ExporterFilterType::Pointer ExporterFilterPointer; /** Get the output in the form of a vtkImage. This call is delegated to the internal vtkImageImporter filter */ vtkImageData * GetOutput() const; /** Set the input in the form of an itk::Image */ using Superclass::SetInput; void SetInput( const InputImageType * ); InputImageType * GetInput(); /** Return the internal VTK image importer filter. This is intended to facilitate users the access to methods in the importer */ vtkImageImport * GetImporter() const; /** Return the internal ITK image exporter filter. This is intended to facilitate users the access to methods in the exporter */ ExporterFilterType * GetExporter() const; /** This call delegates the update to the importer */ void Update(); protected: ImageToVTKImageFilter(); virtual ~ImageToVTKImageFilter(); private: ImageToVTKImageFilter(const Self&); //purposely not implemented void operator=(const Self&); //purposely not implemented ExporterFilterPointer m_Exporter; vtkImageImport * m_Importer; }; } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION #include "itkImageToVTKImageFilter.hxx" #endif #endif
- 写入自己的文件,在此该文件是ITK读取序列,VTK显示。
#if defined(_MSC_VER) #pragma warning ( disable : 4786 ) #endif #ifdef __BORLANDC__ #define ITK_LEAN_AND_MEAN #endif #include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageToVTKImageFilter.h" #include "itkGDCMImageIO.h" #include "itkGDCMSeriesFileNames.h" #include "itkImageSeriesReader.h" #include "vtkImageAnisotropicDiffusion3D.h" #include "vtkImageCast.h" #include <itkShiftScaleImageFilter.h> #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkPiecewiseFunction.h" #include "vtkColorTransferFunction.h" #include "vtkVolumeProperty.h" #include "vtkVolumeRayCastIsosurfaceFunction.h" #include "vtkVolumeRayCastCompositeFunction.h" #include "vtkVolumeRayCastMapper.h" #include "vtkVolume.h" #include "vtkImageCast.h" int main( int argc, char* argv[] ) { if( argc < 2 ) { std::cerr << "Usage: " << argv[0] << " DicomDirectory " << std::endl; return EXIT_FAILURE; } typedef signed short PixelType; const unsigned int Dimension = 3; typedef itk::Image< PixelType, Dimension > ImageType; typedef itk::ImageSeriesReader< ImageType > ReaderType; ReaderType::Pointer reader = ReaderType::New(); typedef itk::GDCMImageIO ImageIOType; ImageIOType::Pointer dicomIO = ImageIOType::New(); reader->SetImageIO( dicomIO ); typedef itk::GDCMSeriesFileNames NamesGeneratorType; NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New(); nameGenerator->SetInputDirectory( argv[1] ); //读取序列,在参数中输入位置 //"e://mi/pic/111" /*const ReaderType::FileNamesContainer & filenames=nameGenerator->GetInputFileNames(); reader->SetFileNames( filenames );*/ typedef std::vector<std::string> FileNamesContainer; FileNamesContainer fileNames = nameGenerator->GetInputFileNames(); reader->SetFileNames( fileNames ); try { reader->Update(); } catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } //ITK TO VTK typedef itk::ImageToVTKImageFilter< ImageType> itkTovtkFilterType; itkTovtkFilterType::Pointer itkTovtkImageFilter = itkTovtkFilterType::New(); itkTovtkImageFilter->SetInput(reader->GetOutput()); vtkImageCast* readerImageCast=vtkImageCast::New(); readerImageCast->SetInput(itkTovtkImageFilter->GetOutput()); readerImageCast->SetOutputScalarTypeToUnsignedShort(); readerImageCast->ClampOverflowOn(); vtkRenderer *aRender = vtkRenderer::New(); vtkRenderWindow *renWin = vtkRenderWindow::New(); renWin->AddRenderer(aRender); vtkRenderWindowInteractor *iRen = vtkRenderWindowInteractor::New(); iRen->SetRenderWindow(renWin); //不透明度映射函数是设置光线方向上的灰度值及其不透明度映射。 vtkPiecewiseFunction *opacityTransferFunction = vtkPiecewiseFunction::New(); opacityTransferFunction->AddPoint(30.0, 0.2); opacityTransferFunction->AddPoint(40.0, 0.3); opacityTransferFunction->AddPoint(50.0, 0.5); opacityTransferFunction->AddPoint(60.0, 0.7); opacityTransferFunction->AddPoint(70.0, 0.9); //颜色映射函数是设置灰度值与RGB颜色的映射。//灰度值及RGB颜色值 vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New(); colorTransferFunction->AddRGBPoint(0.0, 0.5, 0.0, 0.0); colorTransferFunction->AddRGBPoint(30, 0.75, 0.75, 0.75);//皮肤 colorTransferFunction->AddRGBPoint(50, 1, 0.6, 0.07);//骨骼 colorTransferFunction->AddRGBPoint(100.0, 1, 1, 1); vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New(); volumeProperty->SetColor(colorTransferFunction); volumeProperty->SetScalarOpacity(opacityTransferFunction); volumeProperty->ShadeOn(); volumeProperty->SetInterpolationTypeToLinear(); volumeProperty->SetAmbient(0.2); volumeProperty->SetDiffuse(0.9); volumeProperty->SetSpecular(0.2); volumeProperty->SetSpecularPower(10); vtkVolumeRayCastCompositeFunction *compositeFunction = vtkVolumeRayCastCompositeFunction::New(); vtkVolumeRayCastIsosurfaceFunction *RayIso1=vtkVolumeRayCastIsosurfaceFunction::New(); RayIso1->SetIsoValue (50) ; vtkVolumeRayCastIsosurfaceFunction *RayIso2=vtkVolumeRayCastIsosurfaceFunction::New(); RayIso2->SetIsoValue (30) ; vtkVolumeRayCastMapper *volumeMapper1 = vtkVolumeRayCastMapper::New(); volumeMapper1->SetVolumeRayCastFunction(RayIso1); volumeMapper1->SetInputConnection( readerImageCast->GetOutputPort()); vtkVolumeRayCastMapper *volumeMapper2 = vtkVolumeRayCastMapper::New(); volumeMapper2->SetVolumeRayCastFunction(RayIso2); volumeMapper2->SetInputConnection( readerImageCast->GetOutputPort()); vtkVolume *volume1 = vtkVolume::New(); volume1->SetMapper(volumeMapper1); volume1->SetProperty(volumeProperty); vtkVolume *volume2 = vtkVolume::New(); volume2->SetMapper(volumeMapper2); volume2->SetProperty(volumeProperty); aRender->AddVolume(volume1); aRender->SetBackground(1,1,1); aRender->AddVolume(volume2); aRender->SetBackground(1,1,1); renWin->SetSize(600, 600); renWin->Render(); iRen->Initialize(); iRen->Start(); aRender->Delete(); renWin->Delete(); iRen->Delete(); reader->Delete(); opacityTransferFunction->Delete(); colorTransferFunction->Delete(); readerImageCast->Delete(); //duff->Delete(); volumeMapper1->Delete(); volumeMapper2->Delete(); volumeProperty->Delete(); compositeFunction->Delete(); volume1->Delete(); volume2->Delete(); return 0; }
- CMAKE之后即可完成ITK &&VTK 联合编程。
时间: 2024-10-12 16:11:18