在我看来,使用带有范围的矩阵作为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;
以下是上述输出。前两个矩阵打印输出分别为Img0
和Img1
,分别由Mat::zeros
和Mat::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]
答案 0 :(得分:0)
不,这不是错误。
此行Img0(Range::all(), Range::all()) = Img1;
无法按预期工作,因为Img0(Range::all(), Range::all())
形成了一个临时标头,该标头进一步分配给另一个标头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()
发生了类似的影响。