Подтвердить что ты не робот

Обновление подматрицы Mat в OpenCV

Я работаю с OpenCV и С++. У меня есть матрица X, подобная этой

Mat X = Mat::zeros(13,6,CV_32FC1);

и я хочу обновить только подматрицу 4x3, но у меня есть сомнения в том, как эффективно получить доступ к этой матрице.

Mat mat43= Mat::eye(4,3,CV_32FC1);  //this is a submatrix at position (4,4)

Нужно ли менять элемент по элементу?

4b9b3361

Ответ 1

Одним из самых быстрых способов является установка матрицы заголовка, указывающей на диапазон столбцов/строк, которые вы хотите обновить, например:

Mat aux = X.colRange(4,7).rowRange(4,8); // you are pointing to submatrix 4x3 at X(4,4)

Теперь вы можете скопировать вашу матрицу в aux (но на самом деле вы будете копировать ее в X, потому что aux - это просто указатель):

mat43.copyTo(aux);

Вот оно.

Ответ 2

Сначала вам нужно создать матрицу, которая указывает на исходную:

Mat orig(13,6,CV_32FC1, Scalar::all(0));

Mat roi(orig(cv::Rect(1,1,4,3))); // now, it points to the original matrix;

Mat otherMatrix = Mat::eye(4,3,CV_32FC1);

roi.setTo(5);                // OK
roi = 4.7f;                  // OK
otherMatrix.copyTo(roi);     // OK

Имейте в виду, что любые операции, которые связаны с прямой атрибуцией, с значком "=" от другой матрицы изменят источник матрицы roi от orig до этой другой матрицы.

// Wrong. Roi will point to otherMatrix, and orig remains unchanged
roi = otherMatrix;