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

В OpenCV 2.1: Как назначить матрицу подматрице другой матрицы?

Предположим, что у меня есть матрица

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

Что не так с первым подходом?

4b9b3361

Ответ 1

Я бы предпочел один лайнер, но это делает трюк:

cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);

Ответ 2

Пересмотренный ответ

Я считаю причину вашего первого метода

A(cv::Rect_<int>(0,0,2,2)) = B

не работает, потому что оператор присваивания = не копирует значения, а изменяет заголовок матрицы, чтобы указать на подматрицу другого. Поэтому вся эта строка создает временную матрицу заголовков, указывающую на подматрицу A, а затем заменяет заголовок этой временной матрицы точкой B. И тогда забудьте об этом. Данные в и B остаются неизменными.

Что вы хотите (хотя я его не тестировал)

B.copyTo(A(cv::Rect_<int>(0,0,2,2)))

Ответ 3

Вы можете сделать это в одной строке:

B = A(cv::Rect(0,0,2,2)).clone();

Ответ 4

Не бойтесь работать с указателями

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