OpenCV 3:如何将cv::Mat作为可选参数传递 我想在C++中编写一个函数,它将一个矩阵作为一个可选的参数。如果用户在调用函数时传递了矩阵,它将被函数修改,因此我实现了一个pass-by-reference
根据对此的公认答案,可以通过将默认值设置为空垫来实现,例如:OpenCV 3:如何将cv::Mat作为可选参数传递 我想在C++中编写一个函数,它将一个矩阵作为一个可选的参数。如果用户在调用函数时传递了矩阵,它将被函数修改,因此我实现了一个pass-by-reference,c++,opencv,matrix,C++,Opencv,Matrix,根据对此的公认答案,可以通过将默认值设置为空垫来实现,例如: void foo(..., cv::Mat &matrix = cv::Mat()) { // code return; } 但是,当我尝试在OpenCV 3.2中编译此文件时,我从“cv::Mat”类型的右值中得到了“cv::Mat&”类型的非常量引用的无效初始化”错误 自从OpenCV 2.4以来,这个特性有没有改变,或者这个问题可能发生在其他地方?我可能是错的,因为我是这些方面的初学者,但下面是我的想
void foo(..., cv::Mat &matrix = cv::Mat()) {
// code
return;
}
但是,当我尝试在OpenCV 3.2中编译此文件时,我从“cv::Mat”类型的右值中得到了“cv::Mat&”类型的非常量引用的无效初始化”错误
自从OpenCV 2.4以来,这个特性有没有改变,或者这个问题可能发生在其他地方?我可能是错的,因为我是这些方面的初学者,但下面是我的想法。 您希望通过ref传递一个可选参数。问题是带有符号&的引用是对l值的引用,l值是一个存在的对象。C++不允许你写的东西,因为<代码>矩阵< /C>是一个R值,这是一个临时对象,没有与它相关联的实际内存地址。 传递
cv::Mat&matrix=cv::Mat()
的唯一方法是将其保持不变,const-cv::Mat&matrix=cv::Mat()
这当然不是您需要的
IMHO最简单的解决方案是重载函数定义,以便
void foo(…args);
void foo(…参数,cv::Mat&matrix)代码>
<>希望它帮助< p>这是因为C++不允许用rValue/unp>初始化非const引用。
因此,您可以:
1) 将引用设为常量--这不适合您,因为您希望更改函数中矩阵的内容
或
2) 在模块中全局存储cv::Mat
init变量:
static const cv::Mat g_mat = cv::Mat();
void foo(..., cv::Mat &matrix = g_mat) {
不幸的是,你设法使用了问题的一部分是错误的,与第一句话中所说的相矛盾。事实上,关于这个链接的公认答案是部分错误的。也许我们应该解决这个问题,然后将这个标记为重复?我没有在我的原始帖子中指定,但我的问题源于尝试导入其他人的代码(从github),其中该实现在多个函数中使用。这一点,再加上我引用的线索,使我相信可能有一个元素使它工作,我不知何故错过了。也许我太相信人了,但是为什么他们会上传包含4000多行代码的源代码,而不首先检查它是否有效?是的,这就是方法。考虑提供实现。应该是这样的:{cv::Mat dummy;foo(…,dummy);}
。还可以使用4-空格缩进设置代码的格式。