我在CPP中使用ITK编写了一个类,它读取目录中的所有文件,然后对它们进行平均。我想在使用Python构建的管道中使用此类。
我之前曾尝试使用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增加项目依赖性的问题,但我需要一个起点继续。任何帮助都将非常感激。
感谢。
更新:
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 :(得分:3)
主要思想是使用WrapITK模块。它基本上使用内部ITK包装和解析机制(使用GCCXML for C ++进行XML解析 - 将来移动到CastXML)来生成SWIG用来生成Python包装代码的* .i文件。
基本理念:
参考:http://www.itk.org/Wiki/ITK/Release_4/Wrapping/BuildProcess
这就是我要找的东西。
答案 1 :(得分:1)
在Itk软件指南第一卷中。 1(http://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch3.html#x34-410003.7)他们解释说他们正在使用自己的包装:
我之前从未这样做过,但您可以尝试通过他们的包装管道查看生成的* .i文件的样子(或者甚至可能包括您的本地ITK存储库中的过滤器,并查看是否自动包装作品)