Исправленный ответ
Я считаю, что причина вашего первого метода
A(cv::Rect_<int>(0,0,2,2)) = B
не работает, потому что оператор присваивания =
не копирует значения, но изменяет заголовок матрицы, чтобы указывать на подматрицу другой. Поэтому вся эта строка создает временную матрицу заголовка, указывающую на подматрицу A, а затем заменяет заголовок этой временной матрицы на точку B. А затем забудьте об этом. Данные в A и B остаются без изменений.
То, что вы хотите (хотя я не проверял) это
B.copyTo(A(cv::Rect_<int>(0,0,2,2)))