当前位置: 首页 > news >正文

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的区域)设置为0imshow("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是widthint 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;
}
http://www.lryc.cn/news/105057.html

相关文章:

  • python解析帆软cpt及frm文件(xml)获取源数据表及下游依赖表
  • TypeScript
  • 解决启动vue前端报错:npm ERR! Missing script: “serve“
  • 数据结构 | 线性数据结构——列表
  • 【ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)】
  • 在CSDN学Golang场景化解决方案(EFK分布式日志系统方案)
  • MySQL篇
  • 图数据库Neo4j学习四——Spring Data NEO
  • UE虚幻引擎 UTextBlock UMG文本控件超过边界区域以后显示省略号
  • Spring Boot实践五 --异步任务线程池
  • <C语言> 动态内存管理
  • 【ASPICE】:学习记录
  • 图论--最短路问题
  • go 结构体 - 值类型、引用类型 - 结构体转json类型 - 指针类型的种类 - 结构体方法 - 继承 - 多态(interface接口) - 练习
  • 盘点16个.Net开源项目
  • 记录对 require.js 的理解
  • minio-分布式文件存储系统
  • Kindling the Darkness: A Practical Low-light Image Enhancer论文阅读笔记
  • AcWing 4575. Bi数和Phi数
  • 《Federated Unlearning via Active Forgetting》论文精读
  • Java课题笔记~Maven基础知识
  • xcode中如何显示文件后缀
  • SpringBoot使用JKS或PKCS12证书实现https
  • 云原生势不可挡,如何跳离云原生深水区?
  • python的decimal或者叫Decimal,BigDecimal
  • Mac环境变量问题
  • Shell脚本学习-Web服务监控
  • 【ChatGPT】基于WSL+Docker的ChatGPT PLUS共享服务部署
  • 【论文阅读24】Better Few-Shot Text Classification with Pre-trained Language Model
  • 119、Spring容器启动流程是怎样的(配有Spring启动完整流程图)