在OpenCV中,图像矩阵用Mat类来进行存储。
Mat类由两部分组成:矩阵头(包括矩阵尺寸、储存方法、存储地址等信息)和一个指向存储像素矩阵的指针(根据存储方法的不同矩阵的维度也会不同)。
Mat的复制拷贝由于Mat的组成亦可分为两中形式:
1.只复制指向原图像矩阵的指针和信息头而不复制图像矩阵;
Mat A, C;// 仅创建信息头部分
A = imread("1.jpg", CV_LOAD_IMAGE_COLOR);//为矩阵开辟内存,并使A的指针指向该矩阵
Mat B(A);//使用拷贝构造函数将B的指针指向A指向的矩阵
C = A;//使用赋值运算符令C的指针与A的指针指向一致
2.复制图像矩阵;
Mat A = imread("1.jpg");
Mat F = A.clone();
Mat G;
A.copyTo(G);
也正是由于Mat的独特构造,我们可以创造指针指向矩阵但信息头只引用部分数据的Mat对象,即感兴趣区域ROI。
我们可以通过划定某图像矩阵的ROI区域,通过只改变该区域像素值的操作实现图像的区域性改变。
Mat srcImage = imread("1.jpg");
Mat logoImage= imread("2.jpg");
if(!srcImage.data){printf("读取srcImage错误\n"); return false;}
if(!logoImage.data){printf("读取logoImage错误\n"); return false;}
// 定义一个Mat类对象并给其设定ROI区域
Mat ROIImage = srcImage(Rect(200, 250, logoImage.cols, logoImage.rows));
// 加载ROI区域的掩膜(必须是灰度图)
Mat mask = imread("logo.jpg", 0);
//将掩膜复制到对应矩阵的ROI区域
logoImage.copyTo(ROIImage, mask);