1、cv::Rect()只能获取对象的拷贝,而不能获取对象的引用。因此,下面代码是无效的。并不能将image的值赋给image_m的rect区域。可以使用+=
进行赋值,前提是你的image_m应该为全0。
image_m(cv::Rect(0,0,20,20)) = image; //invalid!
image_m(cv::Rect(0,0,20,20)) += image; //right!
2、reshape要求变换对象矩阵A是连续的cv::Mat B=A(Range(begin_row, end_row)等是不连续的Mat图像。如果想转为连续的,最简单的方法,就是将不连续的B 重新clone()一份给新的Mat。
image_m(cv::Rect(0,0,10,10)).reshape(0,100) // error!
image_m(cv::Rect(0,0,10,10)).clone().reshape(0,100) //rigth!
3、两个cv::Mat矩阵要进行数学运算,二者的数据类型必须相同。
4、使用cv::Mat的成员函数进行矩阵操作时,返回值是MatExpr
类型,不能与Mat直接进行操作。一种方法是使用友元函数cv::add(input, output)等。另一种方法是Mat(MatExpr_),将MatExpr类型转为Mat。