我是看了这个网页上的解答才有所启发的,点击打开链接
由于itk使用smart pointer智能指针,所以开辟的内存能够及时的收回,但是有些时候我们需要在后面利用某些值,这是就需要DisconnectPineline()。
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
int main(int argc, char* argv[])
{
if (argc<3)
{
std::cout<<"usage:"<<argv[0]
<<"imagefilename"<<std::endl;
}
typedef itk::Image<unsigned char, 2> ImageType;
typedef itk::ImageFileReader<ImageType> ImageReaderType;
ImageReaderType::Pointer reader = ImageReaderType::New();
typedef itk::ImageFileWriter<ImageType> ImageWriterType;
ImageWriterType::Pointer writer = ImageWriterType::New();
reader->SetFileName(argv[1]);
reader->Update();
ImageType::Pointer image1 = reader->GetOutput();
image1->DisconnectPipeline();
reader->SetFileName(argv[2]);
reader->Update();
ImageType::Pointer image2 = reader->GetOutput();
image2->DisconnectPipeline();
writer->SetFileName("111.jpg");
writer->SetInput(image2);
writer->Update();
return 0;
}
上面的代码简单实现了读写图像的功能,但是使用了两次reader,得到了image1和image2。如果不使用DisconnectPipeline()的话,后面读取的图像会将前面的覆盖,如果像重复利用reader,就要用这个函数。
还是跑一遍代码就清楚了。
还有一点十分重要,使用DisconnectPipeline后,后面就不属于管道的一部分了,而DisconnectPipeline则是管道的末尾,所以必须在之前加update,否则会出错。