OpenCV:如何将cv :: Ptr作为参数传递?

时间:2014-06-20 11:28:29

标签: c++ opencv

我需要将cv::Ptr作为参数传递给函数,我不知道该怎么做。我可以通过引用或价值来传递它吗?我知道std::auto_ptr如果我把它作为值而不是作为参考传递它是非常难看的。

所以:

void foo(cv::Ptr<cv::FeatureDetector> detector) { /*...*/ }

void foo(cv::Ptr<cv::FeatureDetector>& detector) { /*...*/ }

而且,如果我使用const,有什么区别:

void foo(const cv::Ptr<cv::FeatureDetector> detector) { /*...*/ }
void foo(const cv::Ptr<cv::FeatureDetector>& detector) { /*...*/ }

2 个答案:

答案 0 :(得分:4)

cv::Ptr是类似指针的类型,这意味着它提供了引用语义。如果您的cv::Ptrconst,那么它只会让您const访问它指向的对象。这实际上是一个奇怪的怪癖,因为普通指针和标准智能指针不能以这种方式工作。您的功能选择取决于您是否需要能够修改cv::FeatureDetector

如果您需要修改它,您的两个选择是:

void foo(cv::Ptr<cv::FeatureDetector> detector) { /*...*/ }
void foo(cv::Ptr<cv::FeatureDetector>& detector) { /*...*/ }

复制cv::Ptr的开销可能很小(或者至少对您的程序没有影响)。我通常会将任何非const引用参数视为&#34;输出参数&#34;,这表明cv::Ptr本身将被修改。但是由于cv::Ptr的怪癖,这真正意味着它允许cv::FeatureDetector被修改。为了避免这种混淆,我更喜欢值参数。

我假设您正在使用C ++ 03,因为您提到了std::auto_ptr,但如果您升级到C ++ 11并且OpenCV将移动构造函数添加到cv::Ptr,那么您&# 39; ll也有移动语义的好处。

如果您想表示不会修改cv::FeatureDetector,您可以制作参数const。这可确保您不会修改函数内的cv::FeatureDetector。您的选择是:

void foo(const cv::Ptr<cv::FeatureDetector> detector) { /*...*/ }
void foo(const cv::Ptr<cv::FeatureDetector>& detector) { /*...*/ }

第一个与外部的非const值参数没有什么不同。

答案 1 :(得分:1)

cv::Ptr是一个对象。 请参阅其他相关问题和答案:How to pass objects to functions in C++?