opencv04-掩膜

opencv04-掩膜

抠图

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <vector>
#include <array>
#include <algorithm>

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
Image
mask
在这里插入图片描述
img1
在这里插入图片描述
img2
在这里插入图片描述
img3
在这里插入图片描述
img3_2
在这里插入图片描述

掩膜的使用示例二

按照如下流程
在这里插入图片描述

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <vector>
#include <array>
#include <algorithm>

using namespace std;
using namespace cv;

int main() {


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

    //1. 将图片2由彩色变化灰度
    Mat gray;
    cv::cvtColor(image2, gray, COLOR_BGR2GRAY);
    imshow("gray", gray);

    //2. 设置 threshold
    //CV_EXPORTS_W double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );
    Mat black, white;
    cv::threshold(gray, black, 175, 255, ThresholdTypes::THRESH_BINARY);
    //cv::threshold(gray, white, 175, 255, ThresholdTypes::THRESH_BINARY_INV);
    // 也可以通过bitwise_not来实现

    // CV_EXPORTS_W void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());
    cv::bitwise_not(black, white);
    imshow("black", black); // 黑化
    imshow("white", white); // 白化

    //rows 是 height,cols是width
    int r1 = image1.rows, c1 = image1.cols, ch1 = image1.channels();
    int r2 = image2.rows, c2 = image2.cols, ch2 = image2.channels();

    cout << "r1: " << r1 << ", c1: " << c1 << endl;
    cout << "r2: " << r2 << ", c2: " << c2 << endl;

    Rect rect(c1 - c2, r1 - r2, c2, r2); // 设定jiemi图的roi,注意:对roi的操作就是对img1的操作
    // Mat roi(r1 - r2:r1, c1 - c2:c1); // 设定jiemi图的roi,注意:对roi的操作就是对img1的操作


    Mat roi = image1(rect);

    imshow("roi", roi);
    Mat and1;

    int r4 = roi.rows, c4 = roi.cols, ch4 = roi.channels();
    cout << "roi r3: " << r4 << ", roi c3: " << c4 << ", roi ch4: " << ch4 << endl;

    int r3 = black.rows, c3 = black.cols, ch3 = black.channels();
    cout << "black r3: " << r3 << ", black c3: " << c3 << ", black ch3: " << ch3 << endl;

    // CV_EXPORTS_W void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
    cv::bitwise_and(roi, roi, and1, mask = black);
    imshow("and1", and1);

    Mat and2;
    cv::bitwise_and(image2, image2, and2, mask = white);
    imshow("and2", and2);


    // CV_EXPORTS_W void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1);
    //Mat dst;
    cv::add(and1, and2, roi);
    imshow("dst", roi);
    imshow("image1_2", image1);
    waitKey();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值