关于opencv中ROI区域的理解

在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);
    

猜你喜欢

转载自blog.csdn.net/qq_35859033/article/details/80185720
今日推荐