Opencv Matrix Range L值:这是一个错误吗?

时间:2015-04-12 04:10:05

标签: c++ opencv matrix range assignment-operator

在我看来,使用带有范围的矩阵作为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]

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()发生了类似的影响。