2015-04-12 5 views
2

Мне кажется, что использование Матрицы с диапазонами как L-значение (цель назначения) должно работать или нет (и, если не ошибка компилятора, было бы неплохо), но не оба в зависимости от деталей законного значения r.Матрица Opencv Range L значение: Это ошибка?

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

Нет, это не ошибка.

Эта линия 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().

+0

1) Это все еще оказывает основное влияние на значение lvalue, полностью зависящее от r. 2) В чем смысл этого синтаксиса? Какая возможная польза для Img0 (Range :: all(), Range :: all()) = Img1; учитывая то, что он на самом деле делает? Как я понимаю, Img0 (Range :: all(), Range :: all()) = Img1 совпадает с img1 = Img0 (Range :: all(), Range :: all()). Img1 становится заголовком в Img0. – user3288226

Смежные вопросы