OpenCV 3:如何将cv :: Mat作为可选参数传递

时间:2017-06-28 12:45:20

标签: c++ opencv matrix

我想用C ++编写一个函数,它将矩阵作为可选参数。如果用户在调用函数时最终传递矩阵,则函数将对其进行修改,因此我将通过引用实现传递。

根据接受的previous question答案,可以通过将默认值设为空Mat来完成,例如:

void foo(..., cv::Mat &matrix = cv::Mat()) {
    // code

    return;
}

然而,当我尝试在OpenCV 3.2中编译它时,我从'cv :: Mat'类型的rvalue中得到了«cv :: Mat&amp;'类型的非const引用的无效初始化。< / p>

自OpenCV 2.4以来,此功能是否已更改,或问题是否可能在其他地方?

2 个答案:

答案 0 :(得分:5)

我可能错了,因为我是这些事情的初学者,但这就是我的想法。 你想通过ref传递一个可选参数。问题是带有符号&amp;是对l值的引用,l值是存在的对象。 C ++不允许你写的东西,因为matrix是一个r值,它是一个没有与之关联的实际内存地址的临时对象。 你可以传递cv::Mat &matrix = cv::Mat()的唯一方法就是修改const cv::Mat &matrix = cv::Mat(),这当然不是你需要的。

最简单的解决方案IMHO只是重载你的函数定义,以便你有

void foo(...args); void foo(...args, cv::Mat &matrix);

希望有所帮助

答案 1 :(得分:1)

这是因为C ++不允许用rvalue初始化非const引用。

所以你可以:

1)使参考const - 不适合你,因为你想改变函数中矩阵的内容

2)在您的模块中全局存储cv::Mat init变量:

static const cv::Mat g_mat = cv::Mat();

void foo(..., cv::Mat &matrix = g_mat) {