Ответ 1
Я бы предпочел один лайнер, но это делает трюк:
cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);
Предположим, что у меня есть матрица
A = cv::Mat(3,3,CV_32F)
и матрицы
B = cv::Mat(2,2,CV_32F).
Пусть говорят, что A имеет все нули и B имеет все единицы. Я хочу назначить значения B в верхний левый угол A. Как я могу это сделать?
Я попробовал следующее:
A(cv::Rect_<int>(0,0,2,2)) = B
Но это, похоже, не работает. Однако присвоение скалярного значения элементу A этого пути работает:
A(cv::Rect_<int>(0,0,2,2)) = 1.0
Что не так с первым подходом?
Я бы предпочел один лайнер, но это делает трюк:
cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);
Я считаю причину вашего первого метода
A(cv::Rect_<int>(0,0,2,2)) = B
не работает, потому что оператор присваивания =
не копирует значения, а изменяет заголовок матрицы, чтобы указать на подматрицу другого. Поэтому вся эта строка создает временную матрицу заголовков, указывающую на подматрицу A, а затем заменяет заголовок этой временной матрицы точкой B. И тогда забудьте об этом. Данные в и B остаются неизменными.
Что вы хотите (хотя я его не тестировал)
B.copyTo(A(cv::Rect_<int>(0,0,2,2)))
Вы можете сделать это в одной строке:
B = A(cv::Rect(0,0,2,2)).clone();
Не бойтесь работать с указателями
const unsigned int row_size = col_size = 3;
Mat A = Mat::one( row_size, col_size, CV_32F );
Mat B = Mat::zeros( row_size, col_size, CV_32F );
for(int i = 0; i < row_size; i++)
{
float* Aitt = A.ptr<float>(i);
float* Bitt = B.ptr<float>(i);
for(int j = 0; j < ( col_size - i ); ++j)
Aitt[j] = Bitt[j];
}
Что не так с первым подходом?
К многому времени Matlab