OpenCV:传递矩阵作为可选参数

时间:2014-09-11 10:25:55

标签: c++ opencv

我想知道如何在函数中传递矩阵作为可选参数。如果未给出参数,则将其设置为单位矩阵。

如果我做的话

Mat function(const Mat &I, Mat &matrix=Mat::eye(2, 3, CV_32F))
{
    /// some code

    return matrix;
}

然后我收到以下错误:

  

错误:无法转换'cv :: Mat :: eye(int,int,int)(3,5)'   'cv :: MatExpr'到'cv :: Mat&'

提前感谢任何建议。

3 个答案:

答案 0 :(得分:4)

您遇到此问题是因为C++ does not allow a temporary (the default value in this case) to be bound to non-const reference. 您有三个(至少)选择:

Mat function(const Mat &I, const Mat & matrix = Mat::eye(2, 3, CV_32F))

Mat function(const Mat &I, Mat const & matrix = Mat::eye(2, 3, CV_32F))

Mat function(const Mat &I, Mat matrix = Mat::eye(2, 3, CV_32F)) 

或者正如berak所说,你可以将默认值设为空Mat,并使用Mat::empty()进行测试:

Mat function(const Mat &I, Mat & matrix = Mat()) 

答案 1 :(得分:2)

我认为通过引用传递在这里没有多大意义。

通过引用传递的一个原因是使用参数作为返回值(因此修改输入),但是默认值没有多大意义。

通过引用传递的另一个原因可能是某些性能改进,而不是复制整个数据。这对于cv :: Mat来说并不重要,因为它只是一个标题,数据字段无论如何都是通过引用/指针复制的。如果你必须经常调用该函数,那么你可以通过不复制标题来提高性能,但是在这种情况下你不希望有一个默认值来创建一个新的cv :: Mat。< / p>

所以我对你的问题的解决方案是传递价值:

cv::Mat function(cv::Mat matrix = cv::Mat::eye(2,3, CV_32F))
{
    return matrix;
}

int main()
{
    std::cout << function() << "\n\n" ;

    std::cout << function(cv::Mat::zeros(2,3, CV_32F)) << std::endl;

    return 0;
}

给我这个终端输出为希望/期望:

[1, 0, 0;
  0, 1, 0]

[0, 0, 0;
  0, 0, 0]

答案 2 :(得分:-2)

您可以尝试使用Boosts'Optionalhttp://www.boost.org/doc/libs/1_47_0/libs/optional/doc/html/index.html),或者自己编写这样的模板 - 这非常有用。

您也可以通过指针而不是引用传递矩阵。然后,如果指针设置为0nullptr,您可以将其初始化为您想要的任何内容。