我正在尝试编写一个函数(封装)的简单行为,该函数通过 itk ImageToHistogramFilter 根据输入计算直方图。虽然这工作正常,但我似乎无法从函数中得到结果。我最喜欢的函数参数方法是通过引用传递,如果成功则返回零:
int Histogram(HistogramType&result,ImageType const&image1,...
auto f=HistogramFilterType::New();
...
return EXIT_SUCCESS;
但是现在我遇到了一个荒谬的问题,我无法分配结果。
std::cout<<"total frequency: "<<f->GetOutput()->GetTotalFrequency()<<std::endl;//This gives a reasonable value like 2334;
result=*(f->GetOutput());
这不起作用,因为它已被删除:
/usr/local/include/ITK-5.3/itkHistogram.h:80:3: note: declared here
80 | ITK_DISALLOW_COPY_AND_MOVE(Histogram);
我尝试按照文档中选择的方式进行操作:
int Histogram(HistogramType::Pointer result,ImageType::ConstPointer image1,...
auto f=HistogramFilterType::New();
...
std::cout<<"total frequency: "<<f->GetOutput()->GetTotalFrequency()<<std::endl;//This still gives a reasonable value like 2334;
result=f->GetOutput();
std::cout<<"total frequency: "<<rslt->GetOutput()->GetTotalFrequency()<<std::endl;//This too gives a reasonable value like 2334;
...
return EXIT_SUCCESS;
现在确实可以编译,但是当我尝试访问结果(在函数范围之外)时,指向的对象似乎丢失了,尽管它应该是一个智能指针:
auto result=HistogramType::New();
if(Histogram(result,aVariableWithAnImage...
return EXIT_FAILURE;
else
std::cout<<result->GetTotalFrequency()<<std::endl;//This gives 0 now
我尝试了 itk 对象函数 Clone() 和 get() 的其他变体来绕过禁止,但当然(或者幸运的是我必须承认)它不起作用。我觉得我正在做一些根本错误的事情。
您是否尝试过通过
SmartPointer
返回值?比如:
HistogramType::Pointer calcHistogram(/* params */)
{
// compute it
return f->GetOutput();
}