Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV 3:如何将cv::Mat作为可选参数传递 我想在C++中编写一个函数,它将一个矩阵作为一个可选的参数。如果用户在调用函数时传递了矩阵,它将被函数修改,因此我实现了一个pass-by-reference_C++_Opencv_Matrix - Fatal编程技术网

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-空格缩进设置代码的格式。