我需要基本的C++问题的帮助。
我想使用C++函数简化ITK管道,但是我不知道如何传递参数和获取输出。
我已经在ITK示例中看到了如何从main()调用一个函数来创建图像
(如本例所示:http://www.itk.org/Wiki/ITK/Examples/ImageProcessing/LabelGeometryImageFilter)
我想做的是这样的(伪代码):
int main ()
{
Image = reader -> GetOutput();
function1 (input, ouput) // where input is Image
function2 (input, ouput) // where input now is the output of function1
and so on
}
void function1
{
}
void function2
{
}
干杯
埃琳娜
最佳答案
我的印象是,您来自带有ITK管道的长“仅主”功能,现在您希望通过将代码拆分为一些功能来使代码更具可读性,并且您对c++不太自信。如果不是那样,我的答案可能会重复您已经知道的内容。
首先,ITK具有良好的管道结构,因此您可以准备一个将过滤器一个接一个的管道,然后在最后一个过滤器上调用update并获得整个管道来处理图像。如果将输入更改为第一个过滤器,然后再次调用最后一个过滤器的update,则处理将再次开始,因为过滤器检测到其输入自上次以来已发生更改。初学者的一个典型错误(至少对我来说是这样),是在分配输入后立即尝试获取过滤器的输出,而不确保从该过滤器或其后一个更新。无论如何,您也可以在每个过滤器之后调用update,以确保一切正常(并简化了调试)。我不确定是否存在性能问题,但是在我的应用程序中我没有注意到。
因此,当您从这些函数中获取输出时,请记住这一点!
其次,ITK智能指针可以简化您的编程,因为您不必记住使用后将其删除,也不必担心从函数返回时它们将超出范围。这也意味着有时某些事情并不会按预期进行更新,因为它们仍然保留着旧数据(例如,如果在外部声明,则必须谨慎地在for循环内重置过滤器)。但是通常它们可以简化您的生活。
在每个函数中创建小的管道并不是很困难:您的输出将只是该函数最后一个过滤器输出的指针。您可以将此指针设置为函数的返回值(另请参见http://www.itk.org/Wiki/ITK/Examples/Utilities/ReturnObjectFromFunction)。或者,您可以按引用传递输出图像(就像在伪代码中一样,如果您传递的指针已经通过引用传递了)。有关C++的更新,请参见例如http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/。伪代码:
int main ()
{
ImageType::Pointer inputimage, output1, output2;
inputimage = reader -> GetOutput();
output1 = function1 (inputimage) // where input is Image
function2 (output1, output2) // where input now is the output of function1 , pass argument by reference
}
ImageType::Pointer function1 (ImageType::Pointer aInput)
{
somefilter::pointer filter = somefilter::new()
filter ->SetInput( aInput);
filter->Update(); // unless you know what you are doing (you know that youe will access the data only at the end )
return filter->GetOutput()
}
void function2 (ImageType::Pointer aInput, ImageType::Pointer aOutput)
{
somefilter::pointer filter = somefilter::new()
filter ->SetInput( aInput);
filter->Update();
aOutput = filter->GetOutput()
}
您甚至可以决定复制图像(以使其独立于生成图像的管道),然后将其发送到另一个管道,请参阅http://www.itk.org/Wiki/ITK/Examples/SimpleOperations/ImageDuplicator。
附带说明,您还可以使用itk过滤器作为成员来创建自己的类,在初始化时创建管道,然后仅在方法中修改过滤器的输入,而不必每次都重新创建管道。
关于c++ - 在ITK管道中使用C++函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24534163/