opencv04-掩膜

opencv04-掩膜

抠图

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

int main() {

    string filename = R"(D:\workspace\cpp_workspace\my-cv\data\img\1.png)";
    Mat image, mask;
    image = imread(filename);
    imshow("image", image); // 原图

    Mat img1, img2, img3, img4;
    Rect r1(220, 100, 100, 100);// r1是设置好的感兴趣区域
    mask = Mat::zeros(image.size(), CV_8UC1);//第一步建立与原图一样大小的mask图像,并将所有像素初始化为0,因此全图成了一张全黑色图
    mask(r1).setTo(255);//第二步将mask图中的r1区域的所有像素值设置为255,也就是整个r1区域变成了白色。这样就能得到Mask图像了。
    imshow("mask", mask); // 全黑,中间ROI区域为白色
    img1 = image(r1); // 把image里面的ROI区域选择出来
    imshow("img1", img1);


    /**
     * 方法声明: void copyTo( OutputArray m, InputArray mask ) const;
     * m: 目标矩阵,如果在操作之前它没有合适的大小或者类型,将会重新分配
     * mask:和当前对象this一样大小(size)的操作mask,这里mask的大小和image是一样的,
     * mask里面非0的元素表示 矩阵(this)里面需要copied的元素,mask必须为CV_8U类型,有1个或多个通道
     */
    image.copyTo(img2, mask); //注意这句,原图(image)与掩膜(mask)进行与运算后得到了结果图(img2)
    imshow("img2", img2);

    image.copyTo(img3); // img3和image一样
    imshow("img3", img3);


    /**
     * 1. 设置所有的或一些数据的元素为指定的值
     * 2. 这是 Mat::operator=(const Scalar& s) 这个方法的高级变形
     *
     * value: 分配的scalar转为了通常的数组类型
     * mask: 和当前对象this一样大小(size)的操作mask,这里mask的大小和image是一样的,
     * mask里面非0的元素表示 矩阵(this)里面需要copied的元素,mask必须为CV_8U类型,有1个或多个通道
     *
     * */
    img3.setTo(0, mask); // 设置img3中ROI区域(mask中不为0的区域)设置为0
    imshow("img3_2", img3);
    waitKey();
    return 0;
}

image
opencv04-掩膜_第1张图片
mask
opencv04-掩膜_第2张图片
img1
opencv04-掩膜_第3张图片
img2
opencv04-掩膜_第4张图片
img3
opencv04-掩膜_第5张图片
img3_2
opencv04-掩膜_第6张图片

你可能感兴趣的:(opencv,计算机视觉,opencv,人工智能,c++)