gpt4 book ai didi

c++ - 在 ITK 管道中使用 C++ 函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:42 25 4
gpt4 key购买 nike

我需要有关基本(我想)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 管道的长“only-main”函数,现在你想通过将代码拆分成一些函数来使代码更具可读性,并且你对C++。如果不是那样,我的回答可能会重复您已经知道的内容..

首先,ITK 有这个很好的管道结构,所以你可以准备一个管道一个接一个地连接一个过滤器,然后在最后一个过滤器上调用更新并让整个管道处理图像。如果您更改第一个过滤器的输入,并再次调用最后一个过滤器的更新,则处理将再次开始,因为过滤器检测到它们的输入与上次相比发生了变化。初学者的一个典型错误(至少对我来说是这样)是在分配输入后立即尝试获取过滤器的输出,而不确保从该过滤器或其后的过滤器进行更新。不管怎样,你也可以在每个过滤器之后调用更新,只是为了确保一切顺利(并且为了更容易调试)。我不确定是否存在性能问题,但在我的应用程序中我没有注意到。
因此,当您从这些函数中获取输出时,请牢记这一点!

其次,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com