gpt4 book ai didi

c++ - Opencv矩阵范围L值: Is this a bug?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:41 25 4
gpt4 key购买 nike

在我看来,使用带有范围的矩阵作为 L 值(赋值目标)应该有效还是无效(如果不是,编译器错误会很好),但不能同时使用这两个取决于合法 r 值的细节。

cout << "hi mom" <<  endl;
Mat Img0=Mat::zeros(7,7,CV_8UC1);
Mat Img1=Mat::ones(7,7,CV_8UC1);
cout << Img0 << endl;
cout << Img1 << endl;
Img0(Range::all(), Range::all()) = Img1;
cout << Img0 << endl;
Img0(Range::all(), Range::all()) = 1;
cout << Img0 << endl;

下面是上面的输出。前两个矩阵打印输出是 Img0Img1,由 Mat::zerosMat::ones 初始化> 分别。

打印出的第三个矩阵也是 Img0 但在

之后

Img0(Range::all(), Range::all()) = Img1;

我预计会将 Img0 设置为 Img1;即所有的; 但事实并非如此。它仍然全为零。

打印出的第四个/最后一个矩阵是

的结果

Img0(Range::all(), Range::all()) = 1;

它与第三个赋值具有相同的 L 值,但它在标量是 Rvalue 时起作用(不像第三个是作为 RValue 的矩阵)。

在这方面有什么我想念的吗?应该允许这种 r 值区分行为吗?这对我来说似乎不一致。

[0, 0, 0, 0, 0, 0, 0;   
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0]

[1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1]

[0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0]

[1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1;
1, 1, 1, 1, 1, 1, 1]

最佳答案

不,这不是错误。

这一行 Img0(Range::all(), Range::all()) = Img1; 没有按预期工作,因为 Img0(Range::all(), Range::all()) 形成一个临时 header ,进一步分配给另一个 header ,即Img1。请记住,这些操作中的每一个都是 O(1),也就是说,没有数据被复制。因此,没有真正的分配发生。

这样做可以更清楚地实现这个效果:

(Img0(Range::all(), Range::all()) = Img1) = 2;
cout << Img0 << endl;
cout << Img1 << endl;

如果您已经理解我上面描述的内容,您应该知道代码只会更改Img1 的值。输出是:

[0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0]
[2, 2, 2, 2, 2, 2, 2;
2, 2, 2, 2, 2, 2, 2;
2, 2, 2, 2, 2, 2, 2;
2, 2, 2, 2, 2, 2, 2;
2, 2, 2, 2, 2, 2, 2;
2, 2, 2, 2, 2, 2, 2;
2, 2, 2, 2, 2, 2, 2]

进一步阅读:检查发生在 Mat::row() 上的类似效果.

关于c++ - Opencv矩阵范围L值: Is this a bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29585852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com