将 opencv Mat 传递给函数时,对非常量的引用的初始值必须是左值

Posted

技术标签:

【中文标题】将 opencv Mat 传递给函数时,对非常量的引用的初始值必须是左值【英文标题】:Initial value of reference to non-const must be an lvalue when passing opencv Mat to a function 【发布时间】:2021-07-13 14:55:36 【问题描述】:

我有一个垫子。我想根据 Rect 定义的某些区域更新垫子。当我像下面显示的代码一样传递它时,我得到了提到的错误。

void temp2(Mat &A)
  //this function updates the value of A in the region defined by the rect.
 for(i = 0 to A.rows)
  Vec2f *p = reinterpret_cast<Vec2f * >(A.ptr(i));
  for(j = 0 to A.cols)
   //  p[j] = Vec2f(5,5);



void temp1(Mat &A)
  Point a(0,0), b(10,10);
  Rect t(a,b);
  temp2(A(t));


void temp(Mat &A)
  A  = Mat(500, 500, CV_32FC2, Scalar(-1.0, -1.0));
  temp1(A);

int main()
  
 Mat A;
 temp(A);


我查看了解决方案,它说要在 temp2 函数中使 mat A const。我不能在 temp2 函数中使 mat A const,因为我必须更新由 rect 中的 rect 定义的垫子的特定区域temp2 函数。如何以这种方式更新特定区域?

【问题讨论】:

temp2(A(t)); 将修改 A 类型的新临时对象,然后临时对象及其所有更改在结束时被丢弃 ; - 这可能是你现在想要做的.请显示Mat的定义并阅读minimal reproducible example for(i = 0 to A.rows) - 我不知道你从哪里得到这个语法,但它是错误的。 @Yksisarvinen 这是一个伪代码 @RichardCritten 它是 cv::Mat 【参考方案1】:

这不适合你吗?

 /* Renamed arg to reflect what's happening.
    Let it be A if you so wish but it's not
    the original A from temp(). 
  */   
void temp2(Mat &extractedFromA)
  // Do stuff

void temp1(Mat &A)
  Point a(0,0), b(10,10);
  Rect t(a,b);
  Mat extracted = A(t);
  temp2(extracted);

您正在使用this API

Mat cv::Mat::operator() (const Rect & roi)const

这意味着在调用 A(t) 时,A 未被修改(因为上面的 API 是一个 const 方法)并产生一个 新的 Mat 对象是您需要在temp2() 中操作的,而不是传递给temp1() 的原始对象A。此外,对 extracted Mat 所做的更改将反映回原来的 Mat A,因为您只是在它们之间共享标头。

此外,您可能遇到的错误是,由于A(t) 产生了一个临时对象,并且在将其传递给temp2() 时,您试图将它绑定到一个非常量左值引用。将其设为 const 左值引用可以解决此问题,但这显然对您没有帮助。

【讨论】:

我必须为垫子 A 的不同区域多次调用 temp2 函数。因此,每次返回都不是我想要的。有什么方法可以只在 temp2 函数中更新它而不返回 @user16401289 我已经更新了答案中的解释。我之前的理解是错误的。您可以继续从A 中提取子矩阵,然后将其传递给temp2()。对子矩阵的更改应反映回A。您无需继续返回extracted Mat

以上是关于将 opencv Mat 传递给函数时,对非常量的引用的初始值必须是左值的主要内容,如果未能解决你的问题,请参考以下文章

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

OpenCV中将MAT类型的对象作为InputArray类型的对像传递给函数

如何将 opencv Mat 类型传递给 Python 并返回一个数组?

简单的opencv问题,如何把一个vector中的值传递给mat?

OpenCV 从 float* 数组构造 Mat

将图像从 python 包装器传递给 c++ 函数