当前位置: 首页 > 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;
}

相关文章:

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() {str…...

python解析帆软cpt及frm文件(xml)获取源数据表及下游依赖表

#!/user/bin/evn python import os,re,openpyxl 输入&#xff1a;帆软脚本文件路径输出&#xff1a;帆软文件检查结果Excel#获取来源表 def table_scan(sql_str):# remove the /* */ commentsq re.sub(r"/\*[^*]*\*(?:[^*/][^*]*\*)*/", "", sql_str)# r…...

TypeScript

TypeScript 简称&#xff1a; TS &#xff0c;是 JavaScript 的超集 &#xff0c;简单来说就是&#xff1a; JS 有的 TS 都有 TypeScript Type JavaScript &#xff08;在 JS 基础之上&#xff0c; 为 JS 添加了类型支持 &#xff09; TypeScript 是 微软 开发…...

解决启动vue前端报错:npm ERR! Missing script: “serve“

目录 一、遇到问题 二、出现报错的两个原因 三、解决办法 一、遇到问题 npm ERR! Missing script: "serve" npm ERR! npm ERR! To see a list of scripts, run: npm ERR! npm run npm ERR! A complet...

数据结构 | 线性数据结构——列表

目录 一、无序列表抽象数据类型 二、实现无序列表&#xff1a;链表 2.1 Node类 2.2 UnorderedList类 三、有序列表抽象数据类型 四、实现有序列表 列表是元素的集合&#xff0c;其中每一个元素都有一个相对于其他元素的位置。更具体地说&#xff0c;这种列表成为无序列表…...

【ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)】

文章目录 BIC 指令ORR 位或指令EOR 异或指令 上篇文章&#xff1a;ARM 常见汇编指令学习 5 – arm64汇编指令 wzr 和 xzr 下篇文章&#xff1a;ARM 常见汇编指令学习 7 - LDR 指令与LDR伪指令及 mov指令 BIC 指令 指令格式 bic{条件}{S} Rd&#xff0c;Rn&#xff0c;operan…...

在CSDN学Golang场景化解决方案(EFK分布式日志系统方案)

一&#xff0c;ElasticSearch 分布式集群部署 在 Golang EFK 分布式日志系统方案中&#xff0c;ElasticSearch 是一个分布式搜索引擎和数据存储库&#xff0c;它可以用于存储和搜索大量的日志数据。以下是 ElasticSearch 分布式集群部署的步骤&#xff1a; 下载 ElasticSearc…...

MySQL篇

文章目录 一、MySQL-优化1、在MySQL中&#xff0c;如何定位慢查询?2、SQL语句执行很慢, 如何分析呢&#xff1f;3、了解过索引吗&#xff1f;&#xff08;什么是索引&#xff09;4、索引的底层数据结构了解过嘛 ?5、什么是聚簇索引什么是非聚簇索引 ?6、知道什么是回表查询嘛…...

图数据库Neo4j学习四——Spring Data NEO

1配置 1.1Maven依赖 <!--neo4j --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency>1.2yml配置 spring:data:neo4j:uri: bolt://localhost:76…...

UE虚幻引擎 UTextBlock UMG文本控件超过边界区域以后显示省略号

版本 5.2.1 裁剪 - 剪切 - 剪切到边界 裁剪 - 高级 - 溢出策略 - 省略...

Spring Boot实践五 --异步任务线程池

一、使用Async实现异步调用 在Spring Boot中&#xff0c;我们只需要通过使用Async注解就能简单的将原来的同步函数变为异步函数&#xff0c;Task类实现如下&#xff1a; package com.example.demospringboot;import lombok.extern.slf4j.Slf4j; import org.springframework.s…...

<C语言> 动态内存管理

1.动态内存函数 为什么存在动态内存分配&#xff1f; int main(){int num 10; //向栈空间申请4个字节int arr[10]; //向栈空间申请了40个字节return 0; }上述的开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的。数组在声明的时候&#xff0c;必须指定数组的…...

【ASPICE】:学习记录

学习记录 ASPICE中文资料什么是ASPICE过程参考模型 ASPICE全称“Automotive Software Process Improvement and Capability dEtermination”&#xff0c;即“汽车软件过程改进及能力评定”模型框架 ASPICE中文资料 主要资料来源 什么是ASPICE 过程参考模型...

图论--最短路问题

图论–最短路问题 邻接表 /* e[idx]:存储点的编号 w[idx]:存储边的距离&#xff08;权重&#xff09; */ void add(int a, int b, int c) {e[idx] b;ne[idx] h[a];w[idx] ch[a] idx ; }1.拓扑排序 给定一个 n 个点 m 条边的有向图&#xff0c;点的编号是 11 到 n&#xf…...

go 结构体 - 值类型、引用类型 - 结构体转json类型 - 指针类型的种类 - 结构体方法 - 继承 - 多态(interface接口) - 练习

目录 一、结构体 1、python 与 go面向对象的实现&#xff1a; 2、初用GO中的结构体&#xff1a;&#xff08;实例化一个值类型的数据&#xff08;结构体&#xff09;&#xff09; 输出结果不同的三种方式 3、实例化一个引用类型的数据&#xff08;结构体&#xff09; 4、…...

盘点16个.Net开源项目

今天一起盘点下&#xff0c;16个.Net开源项目&#xff0c;有博客、商城、WPF和WinForm控件、企业框架等。&#xff08;点击标题&#xff0c;查看详情&#xff09; 一、一套包含16个开源WPF组件的套件 项目简介 这是基于WPF开发的&#xff0c;为开发人员提供了一组方便使用自…...

记录对 require.js 的理解

目录 一、使用 require.js 主要是为了解决这两个问题二、require.js 的加载三、main.js 一、使用 require.js 主要是为了解决这两个问题 实现 js 文件的异步加载&#xff0c;避免网页失去响应&#xff1b;管理模块之间的依赖性&#xff0c;便于代码的编写和维护。 二、require.…...

minio-分布式文件存储系统

minio-分布式文件存储系统 minio的简介 MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置…...

Kindling the Darkness: A Practical Low-light Image Enhancer论文阅读笔记

这是ACMMM2019的一篇有监督暗图增强的论文&#xff0c;KinD其网络结构如下图所示&#xff1a; 首先是一个分解网络分解出R和L分量&#xff0c;然后有Restoration-Net和Adjustment-Net分别去对R分量和L分量进一步处理&#xff0c;最终将处理好的R分量和L分量融合回去。这倒是很常…...

AcWing 4575. Bi数和Phi数

文章目录 题意:思路:代码 题意: 就是给你n个数&#xff0c;对于每一个数y你都需要找到一个最小x使得 ϕ ( x ) ≥ y \phi(x) \ge y ϕ(x)≥y&#xff0c;然后再求一个最小平和。 思路: 其实最开始以来的思路就是二分&#xff0c;我先进行线性筛求出每个数的欧拉函数&#xf…...

基于GIS三维地球的全球指挥官推演沙盘软件军迷免费版 谷歌地球 数字孪生 自媒体创作 战术想定编辑

一套完全自主的、基于真实地理坐标系的沉浸式战术推演引擎&#xff0c;其技术栈的构建是对传统可视化与交互范式的系统性革新。 全球指挥官沙盘软件军迷免费版下载 一、 项目概述&#xff1a;一个核心命题与两项技术挑战 本项目源于一个明确的工程命题&#xff1a;构建一个允…...

深入解析TI C6474多核DSP架构:从硬件设计到并行编程实战

1. 项目概述&#xff1a;从单核到多核的必然演进在嵌入式信号处理领域&#xff0c;德州仪器&#xff08;TI&#xff09;的TMS320系列DSP一直是高性能、高可靠性的代名词。我接触TI DSP超过十年&#xff0c;从早期的C5000系列到后来的C6000系列&#xff0c;亲眼见证了其从单核、…...

收藏!揭秘高薪职业:AI大模型训练师,小白也能入门的AI时代新机遇!

本文介绍了AI大模型训练师这一新兴职业&#xff0c;旨在解决AI与人类沟通的障碍。训练师通过拆解人类模糊需求&#xff0c;教AI识别信号&#xff0c;输出精准回应。随着AI技术普及&#xff0c;该岗位需求激增&#xff0c;薪资可达3w。工作内容包括数据管理、模型训练、评估迭代…...

服务间鉴权的方式

服务间鉴权的方式1. API Key&#xff08;静态密钥&#xff09;Java 中如何生成随机数&#xff1a;什么是 LCG&#xff1f;/dev/random 和 /dev/urandom 详解1. Math.random() —— 绝对禁用2. java.util.Random —— 明文禁止&#xff08;安全场景&#xff09;3. java.security…...

Claude中文完整上手指南:官网、API、Claude Code与国内使用一篇讲透

Claude中文完整上手指南&#xff1a;官网、API、Claude Code与国内使用一篇讲透 写在前面 现在再看 Claude&#xff0c;已经不能只把它当成一个聊天工具了。 对普通用户来说&#xff0c;它是一个很强的长文理解、写作整理和复杂问答助手&#xff1b;对开发者来说&#xff0c;…...

Agentic Workflow实战:多智能体分治架构设计与落地

1. 项目概述&#xff1a;这不是“写个脚本”&#xff0c;而是重新设计人与AI协作的神经回路“Getting Started With Agentic Workflows”——这个标题乍看像一份入门指南&#xff0c;但如果你真把它当成“教你怎么装个Python包”&#xff0c;那接下来三个月你大概率会卡在第三步…...

HS2汉化补丁终极指南:打造完美中文游戏体验的完整解决方案

HS2汉化补丁终极指南&#xff1a;打造完美中文游戏体验的完整解决方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2汉化补丁是针对Honey Select 2游戏的专…...

回归测试:确保 Harness 更新不破坏现有功能

回归测试实战指南:如何确保Harness平台更新不破坏现有CI/CD核心功能? 摘要/引言 你有没有遇到过这种场景:为了用上Harness新出的金丝雀发布优化功能,团队兴高采烈更新了平台版本,结果第二天全公司一半的发版流水线集体挂了?跨阶段传参失效、K8s部署权限报错、自定义插件…...

【参数辨识】经典Prandtl–Ishlinskii(PI)迟滞模型及其PSO算法参数辨识【含Matlab源码 15544期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…...

如何用OpenUtau实现多语言歌声合成:3大音素处理方案完全指南

如何用OpenUtau实现多语言歌声合成&#xff1a;3大音素处理方案完全指南 【免费下载链接】OpenUtau Open singing synthesis platform / Open source UTAU successor 项目地址: https://gitcode.com/gh_mirrors/op/OpenUtau OpenUtau作为开源歌声合成平台&#xff0c;通…...