我想知道如何在函数中传递矩阵作为可选参数。如果未给出参数,则将其设置为单位矩阵。
如果我做的话
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&'
提前感谢任何建议。
答案 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'Optional
(http://www.boost.org/doc/libs/1_47_0/libs/optional/doc/html/index.html),或者自己编写这样的模板 - 这非常有用。
您也可以通过指针而不是引用传递矩阵。然后,如果指针设置为0
或nullptr
,您可以将其初始化为您想要的任何内容。