将 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中将MAT类型的对象作为InputArray类型的对像传递给函数
如何将 opencv Mat 类型传递给 Python 并返回一个数组?