我已經使用CPP中的ITK編寫了一個類,該類讀取目錄中的所有文件,然後對其進行平均。我想在使用Python構建的管道中使用這個類。如何在Python中使用ITK類
我以前曾嘗試使用Swig包裝模板代碼,但根據swig documenation,它沒有模板支持,並且類型名稱需要明確指定。但是當我使用ITK in Python時,接口與Swig生成的模板代碼所期望的截然不同(類型名稱根本不在函數/類名稱中指定,這與Swig文檔所述相反)。
從我的代碼示出了類的用法小片段如下:
typedef unsigned char PixelType;
typedef itk::Image<PixelType, 2> ImageType;
typedef itk::NaryMeanImageFilter< ImageType, ImageType > FilterType; // custom class
typedef itk::ImageFileReader<ImageType> ReaderType;
typedef itk::ImageFileWriter<ImageType> WriterType;
ImageType::Pointer image = ImageType::New();
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
FilterType::Pointer filter = FilterType::New(); // custom class
for (unsigned int i = 0; i< fileNames.size(); ++i)
{
reader->SetFileName(fileNames[i]);
filter->SetInput(i, reader->GetOutput()); // custom class
}
writer->SetFileName(outName);
writer->SetInput(filter->GetOutput());
writer->Update();
該類的代碼可以在Git repository可以看出。我沒有使用Boost :: Python增加我的項目的依賴關係的問題,但我需要一個起點繼續。任何幫助將不勝感激。
謝謝。
UPDATE:
在Python預期的用法是,
readerType=itk.ImageFileReader[inputImageType]
reader=readerType.New()
filterType=itk.NaryMeanImageFilter[inputImageType,inputImageType]
filter=filterType.New()
for i in range(0, fileNames.size()):
reader.SetFileName(fileNames[i])
filter.SetInput(i, reader->GetOutput())
能否請您詳細說明您嘗試過什麼,以及SWIG模板支持缺少的內容?與SWIG類似,Boost.Python無法封裝模板,但它可以封裝模板實例。如果不是不可能集成兩個綁定庫會非常困難,因爲大多數對排序和分派都有獨佔控制。另外,git倉庫鏈接404s。 –
那麼,我試圖使用SWIG實例化模板類,但是使用方式非常不同(例如,在上面的過濾器中,Python的用法將是itk.NaryMeanImageFilter_UC()等等,用於不同的數據類型)。我希望該用法與不同的ITK模塊一致 – scap3y