2015-05-15 7 views
5

Ich habe eine Klasse mit ITK in CPP geschrieben, die alle Dateien in einem Verzeichnis liest und dann mittelt. Ich möchte diese Klasse in einer Pipeline verwenden, die mit Python erstellt wurde.Wie verwende ich eine ITK-Klasse in Python

Ich hatte zuvor versucht, Swig zu verwenden, Vorlagencode einzuschließen, aber gemäß der swig documenation, hat es keine Vorlagenunterstützung und die Typnamen müssen explizit angegeben werden. Aber wenn ich ITK in Python verwende, ist die Schnittstelle sehr unterschiedlich zu der, die ich von Swig-generierten Vorlage-Code erwarte (der Typ-Name ist überhaupt nicht in der Funktion/Klassenname angegeben, was im Gegensatz zu Swig-Dokumentation steht). für die Klasse in den Git repository gesehen werden kann

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

Der Code:

Ein kleiner Ausschnitt aus meinem Code die Verwendung der Klasse darstellt, ist unten dargestellt. Ich habe kein Problem mit der Erhöhung der Abhängigkeiten von meinem Projekt mit Boost :: Python, aber ich brauche einen Ausgangspunkt, um fortzufahren. Jede Hilfe würde sehr geschätzt werden.

Danke.

UPDATE:

Erwartete Verwendung in Python wäre,

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

Können Sie bitte erläutern, was Sie versucht haben und was fehlt mit SWIG Vorlagen Unterstützung? Ähnlich wie bei SWIG kann Boost.Python keine Vorlagen umbrechen, aber es kann Vorlageninstanzen umhüllen. Es kann extrem schwierig, wenn nicht sogar unmöglich sein, zwei Bindungsbibliotheken zu integrieren, da die meisten eine exklusive Kontrolle in Bezug auf Typentnahme und -verteilung haben. Auch die Git-Repository-Verbindung 404s. –

+0

Nun, ich habe versucht, Template-Klassen mit SWIG zu instanziieren, aber die Verwendung ist sehr unterschiedlich (zum Beispiel wäre im obigen Filter die Python-Verwendung itk.NaryMeanImageFilter_UC() usw. für verschiedene Datentypen). Ich möchte, dass die Verwendung mit den verschiedenen ITK-Modulen konsistent ist. – scap3y

Antwort

3

Die Grundidee ist die Verwendung des WrapITK-Moduls. Es verwendet im Wesentlichen den internen ITK-Wrapping- und Parsing-Mechanismus (mit GCCXML für C++ zu XML-Parsing - um später in CastXML verschoben zu werden), um die * .i-Dateien zu generieren, die SWIG zum Erzeugen des Python-Wrapping-Codes verwendet.

Grundidee:

  • Sagen Sie bitte einen Filter haben ITK ‚itkDummy.h‘, die aus einem Python-Skript verwenden möchten
  • Schreibe eine Datei ‚itkDummy.wrap‘ die Informationen über die Pixeltypen geben und Vorlageninitialisierungen.
  • Verwenden Sie das WrapITK Modul (die zusammen mit den ITK Python-Bindungen ist) - überprüft werden muss, weil jedes Mal, wenn ich das versucht, hielt ich einen Fehler bekommen
  • glücklich sein, dass itkDummy von Python genannt werden kann

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

Das ist, was ich gesucht habe.

1

In Itk Software-Handbuch Bd. 1 (http://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch3.html#x34-410003.7) erklären sie, dass sie ihre eigene Verpackung verwenden, bestehend aus:

  1. gccxml, das erzeugt XML-Dateien von C++ Programm
  2. ein Skript namens igenerator.py, die .i Dateien für swig
  3. erzeugt
  4. swig

ich habe es noch nie zuvor getan, aber man könnte versuchen, durch ihre Umhüllung Pipeline zu gehen, um zu sehen, wie die erzeugt * .i-Datei sieht aus wie (oder vielleicht sogar Ihre Filter in Ihrer lokalen ITK-Repository einschließlich und Prüfen Sie, ob der Umbruch automatisch funktioniert.

+1

Danke für Ihre Antwort, aber es war nicht das, wonach ich gesucht habe (ich suchte nach Entwicklungsdetails, erklärte den Link, den ich gepostet habe). – scap3y

+0

@ scap3y haben Sie den Link gelöscht? – lib

+0

Nein, aktualisierte die Antwort mit einer "richtigen Beschreibung", nachdem der Moderator sie gelöscht hatte. – scap3y

Verwandte Themen