В OpenCV 2.1: как назначить матрицу подматрице другой матрицы? - PullRequest
23 голосов
/ 27 октября 2010

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

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

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

Ответы [ 4 ]

36 голосов
/ 30 октября 2010

Я бы предпочел однострочник, но это помогает:

cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);
14 голосов
/ 25 сентября 2012

Исправленный ответ

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

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

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

То, что вы хотите (хотя я не проверял) это

B.copyTo(A(cv::Rect_<int>(0,0,2,2)))
4 голосов
/ 04 апреля 2013

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

B = A(cv::Rect(0,0,2,2)).clone();
3 голосов
/ 29 октября 2010

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

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 время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...