2015-05-15 28 views
5

我已經使用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()) 
+0

能否請您詳細說明您嘗試過什麼,以及SWIG模板支持缺少的內容?與SWIG類似,Boost.Python無法封裝模板,但它可以封裝模板實例。如果不是不可能集成兩個綁定庫會非常困難,因爲大多數對排序和分派都有獨佔控制。另外,git倉庫鏈接404s。 –

+0

那麼,我試圖使用SWIG實例化模板類,但是使用方式非常不同(例如,在上面的過濾器中,Python的用法將是itk.NaryMeanImageFilter_UC()等等,用於不同的數據類型)。我希望該用法與不同的ITK模塊一致 – scap3y

回答

3

主要想法是使用WrapITK模塊。它基本上使用內部的ITK包裝和解析機制(使用GCCXML進行C++到XML解析 - 將來會轉移到CastXML)來生成SWIG用來生成Python包裝代碼的* .i文件。

基本思想:

  • 假設你有一個ITK過濾器「itkDummy.h」這想從一個Python腳本
  • 使用寫文件「itkDummy.wrap」,提供有關像素類型的信息和模板初始化。
  • 使用WrapITK模塊(這與ITK Python綁定一起) - 需要驗證,因爲每次我想這個時候,我不停收到錯誤
  • 高興的是,itkDummy可以從Python的
被稱爲

參考:http://www.itk.org/Wiki/ITK/Release_4/Wrapping/BuildProcess

這就是我正在尋找。

1

在中Itk軟件指南卷。 1(http://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch3.html#x34-410003.7)他們解釋他們正在使用他們自己的包裝,包括:

  1. gccxml,其生成從C++程序XML文件
  2. 被叫igenerator.py腳本,其產生.I文件痛飲
  3. 痛飲

我從來沒有這麼做過,但你可以嘗試去通過他們的包裝流水線查看生成的* .i文件看起來像(或者甚至包括在本地ITK庫的過濾器和看看包裝是否自動工作)

+1

感謝您的回覆,但這不是我所期待的(我正在尋找開發細節,解釋了我發佈的鏈接)。 – scap3y

+0

@ scap3y你刪除了鏈接嗎? – lib

+0

沒有,在主持人刪除它之後用「正確描述」更新了答案。 – scap3y