2015-01-31 2 views
1

Почему следующий сегмент кода работыПочему этот диапазон взрывать

int sizearray[3] = {3,4,2}; 
Mat OneM = Mat::ones(3,4,CV_8UC1); 
Mat TwoM = Mat::ones(3,4,CV_8UC1)+1; 
Mat OneTwo3D = Mat::zeros(3,sizearray,CV_8UC1); 
Mat OneTwo3DPlaneM; 
Range OneTwo3DRanges[] = {Range(1,3),Range(1,4),Range(1,2)}; 
OneTwo3DPlaneM = OneTwo3D(OneTwo3DRanges); 

, но если я изменить диапазоны для

Range OneTwo3DRanges[] = {Range(1,4),Range(1,4),Range(1,2)}; 

она взрывается.

В рабочей один, по-видимому, OneTwo3DPlaneM матрица 2x3x1, как ожидалось, учитывая, что «конец» в Range эксклюзивна (подтверждено, глядя на рабочий код/​​результат диапазона OneTwo3DPlaneM.size.p который [2,3,1]). Однако, только увеличивая первый диапазон от Range(1,3) до Range(1,4) вызывает ошибку на

OneTwo3DPlaneM = OneTwo3D(OneTwo3DRanges); 

Примечания, что я пытаюсь сделать, в конце концов, это присвоить изображение в кусочек 3d arrray (через OneM.copyTo(OneTwo3DPlaneM) я думаю). Вышеприведенный код является просто тестом для этого. Итак, я просто хочу создать матрицу, которая ссылается на плоскость OneTwo3D, так что для этого теста я могу назначить матрицы OneM первой плоскости и, в конечном счете, TwoM на вторую плоскость (после того, как я изменил третий диапазон, чтобы указать на OneTwo3D)

Учитывая, что у меня нет большого опыта работы с opencv, я предполагаю, что я делаю что-то замедленное. Извинитесь впереди.

+0

Да, «конец» диапазона является исключительным, просто не ожидайте, что он «зацепит» любое значение, которое вы дадите ему чему-то действительному. как вы уже выяснили ранее, 3 - максимальное допустимое значение в вашем случае. – berak

+0

, если OneTwo3D создается как матрица 3x4x2 и диапазон (1,4) ==> от 1 до 3, то он, безусловно, должен быть действительным, а если нет, разве это не ошибка? В конце концов, если я не могу сделать так, какой другой способ? Это не то, что оператор 'Mat Mat :: operator() (const Range * range) const'is для – user3288226

+0

в качестве побочного элемента, в большинстве ситуаций лучше использовать Mat (3,4, CV_32FC (2)) вместо , гораздо проще в использовании и лучше поддерживать большинство операций математики. – berak

ответ

0

Код, кажется, работает. По-видимому, copyTo не любит назначать из 2d в кусок 3d-массива. Итак, как показано ниже, я изменил OneM и TwoM от 3x4 матриц до 3x4x1, а затем он сработал. Я предполагаю, что тогда задан вопрос (2d), можно ли просто изменить его на трехмерную сущность с одномерным 3-м измерением для копирования. Я не уверен, как это сделать, учитывая, что изменение только работает с 2d массивами.

int sizearray1[3] = {3,4,1}; 
int sizearray[3] = {3,4,2}; 
//  Mat OneM = Mat::ones(3,4,CV_8UC1); 
Mat OneM = Mat::ones(3,sizearray1,CV_8UC1); 
//  Mat TwoM = Mat::ones(3,4,CV_8UC1)+1; 
Mat TwoM = Mat::ones(3,sizearray1,CV_8UC1)+1; 
Mat OneTwo3D = Mat::zeros(3,sizearray,CV_8UC1); 
Mat OneTwo3DPlaneM; 
Range OneTwo3DRanges[] = {Range::all(),Range::all(),Range(0,1)}; 
OneTwo3DPlaneM = OneTwo3D(OneTwo3DRanges); 
OneM.copyTo(OneTwo3DPlaneM); 
OneTwo3DRanges[2] = Range(1,2); 
OneTwo3DPlaneM = OneTwo3D(OneTwo3DRanges); 
TwoM.copyTo(OneTwo3DPlaneM); 
Смежные вопросы