我是看了這個網頁上的解答才有所啟發的,點選打開連結
由于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,否則會出錯。