2015-05-15 15 views
5

Ho scritto una classe utilizzando ITK in CPP che legge tutti i file in una directory e quindi li media. Mi piacerebbe usare questa classe in una pipeline costruita usando Python.Come utilizzare una classe ITK in Python

Avevo già provato a utilizzare Swig per avvolgere il codice del modello, ma secondo lo swig documenation, non ha il supporto dei modelli e i nomi dei tipi devono essere specificati esplicitamente. Ma quando uso lo ITK in Python, l'interfaccia è molto diversa da quella che mi aspetto dal codice del template generato da Swig (il nome del tipo non è specificato nel nome della funzione/classe, il che è contrario a ciò che dice la documentazione di Swig).

Un piccolo frammento dal mio codice illustra l'utilizzo della classe è stata di:

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(); 

Il codice della classe può essere visto nel Git repository. Non ho un problema con l'aumento delle dipendenze del mio progetto usando Boost :: Python ma ho bisogno di un punto di partenza per procedere. Qualsiasi aiuto sarebbe estremamente apprezzato.

Grazie.

UPDATE:

utilizzo atteso in Python sarebbe,

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

Puoi per favore approfondire cosa hai provato e cosa manca con il supporto dei modelli di SWIG? Simile a SWIG, Boost.Python non può eseguire il wrapping dei modelli, ma può eseguire il wrapping di istanze del modello. Può essere estremamente difficile, se non impossibile, integrare due librerie di rilegatura, dato che la maggior parte ha un controllo esclusivo per quanto riguarda l'estrazione e la distribuzione dei caratteri. Inoltre, il link git link 404s. –

+0

Beh, ho provato a creare istanze di classi di template usando SWIG ma l'uso è molto diverso (ad esempio, nel filtro precedente, l'uso di Python sarebbe itk.NaryMeanImageFilter_UC(), ecc. Per diversi tipi di dati). Vorrei che l'utilizzo fosse coerente con i diversi moduli ITK – scap3y

risposta

3

L'idea principale è utilizzare il modulo WrapITK. Fondamentalmente utilizza il wrapping interno ITK e il meccanismo di analisi (utilizzando GCCXML per l'analisi C++ in XML - da trasferire a CastXML in futuro) per generare i file * .i che SWIG utilizza per generare il codice di wrapping Python.

idea di base:

  • Diciamo che hanno un filtro ITK 'itkDummy.h', che vuole utilizzare da uno script Python
  • Scrivere un file 'itkDummy.wrap' dare le informazioni sui tipi di pixel e inizializzazioni di modelli.
  • Utilizza il modulo WrapITK (che è insieme agli attacchi ITK Python) - deve essere verificata, perché ogni volta che ho provato questo, ho continuato a ottenere un errore
  • essere felici che itkDummy può essere chiamato da Python

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

Questo è quello che stavo cercando.

1

In Itk Guida al software vol. 1 (http://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch3.html#x34-410003.7) spiegano che stanno usando il loro involucro composto da:

  1. gccxml, che genera file XML da programma C++
  2. uno script chiamato igenerator.py, che genera file .i per sorso
  3. sorso

non l'ho mai fatto prima, ma si potrebbe provare a passare attraverso il loro pipeline di avvolgimento per vedere come il file generato * .i assomiglia (o forse anche compreso il filtro nel repository locale e ITK vedere se il wrapping funziona automaticamente)

+1

Grazie per la tua risposta, ma non era quello che stavo cercando (stavo cercando i dettagli di sviluppo, ho spiegato il link che ho postato). – scap3y

+0

@ scap3y hai cancellato il link? – lib

+0

No, ha aggiornato la risposta con una "descrizione corretta" dopo che il moderatore l'ha cancellata. – scap3y

Problemi correlati