OpenCV图像处理——按最小外接矩形剪切图像
引言
在图像处理过程中,提取感兴趣区域(ROI)并在其上进行处理后,往往需要将处理后的结果映射回原图像。这一步通常涉及以下几个步骤:
找到最小外接矩形:使用 cv::boundingRect 或 cv::minAreaRect 提取感兴趣区域的最小外接矩形。
从原图中提取 ROI:根据矩形坐标从原图中剪切出 ROI 进行处理。
在 ROI 上进行处理:对提取出的 ROI 进行特定的图像处理操作。
将处理后的 ROI 映射回原图:将处理后的结果重新放置回原图的相应位置。
鼠标选取区域
可以使用OpenCV和C++来通过鼠标绘制多边形,并确定闭合点。功能通过捕捉鼠标事件来实现。绘制多边形时,当点击的点接近第一个点时,可以自动将多边形闭合。
在绘制多边形并将其闭合后,通过OpenCV的 minAreaRect 函数来计算该多边形的最小外接矩形。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>using namespace cv;
using namespace std;vector<Point> points; // 存储鼠标点击的点
bool drawing = false; // 是否正在绘制
const int CLOSE_DISTANCE = 10; // 闭合多边形的最小距离// 判断当前点是否接近第一个点
bool isCloseToFirstPoint(Point p) {if (points.empty()) return false;return norm(p - points[0]) < CLOSE_DISTANCE;
}// 鼠标回调函数
void onMouse(int event, int x, int y, int, void* param) {Mat& image = *(Mat*)param;if (event == EVENT_LBUTTONDOWN) {Point p(x, y);if (isCloseToFirstPoint(p) && points.size() > 2) {// 如果点接近第一个点并且有至少三个点,则闭合多边形points.push_back(points[0]);polylines(image, points, true, Scalar(0, 255, 0), 2); // 闭合并绘制多边形// 计算最小外接矩形RotatedRect minRect = minAreaRect(points);// 获取矩形的4个顶点Point2f rect_points[4];minRect.points(rect_points);// 绘制最小外接矩形for (int i = 0; i < 4; i++) {line(image, rect_points[i], rect_points[(i + 1) % 4], Scalar(255, 0, 0), 2);}imshow("Image", image); // 显示最终结果drawing = false;} else {// 否则继续添加点drawing = true;points.push_back(p);}} else if (event == EVENT_MOUSEMOVE && drawing) {Mat tempImage = image.clone(); // 创建临时图像用于显示if (!points.empty()) {polylines(tempImage, points, false, Scalar(255, 0, 0), 2); // 画多边形line(tempImage, points.back(), Point(x, y), Scalar(255, 0, 0), 2); // 绘制最后一条线}imshow("Image", tempImage);}else if (event == EVENT_RBUTTONDOWN && !points.empty()) {// 右键按下,重置并清除所有点points.clear();image = Mat::zeros(image.size(), image.type()); // 重置图像imshow("Image", image);drawing = false;}
}int main() {// 创建空白图像Mat image = Mat::zeros(Size(800, 600), CV_8UC3);// 设置鼠标回调namedWindow("Image", WINDOW_AUTOSIZE);setMouseCallback("Image", onMouse, &image);// 显示图像并等待退出imshow("Image", image);waitKey(0);return 0;
}
按最小外接矩形剪切图像
bool is_rotated_rect(const cv::RotatedRect& rect)
{// 检查中心点是否在合理范围内if (rect.center.x == 0 && rect.center.y == 0){return false;}// 检查宽度和高度是否为正值if (rect.size.width <= 0 || rect.size.height <= 0){return false;}// 如果以上条件都满足,可以认为矩形是有效的return true;
}bool cut_rotate_roi(cv::Mat& cv_src, cv::RotatedRect& minRect, cv::Mat& cv_roi)
{if (is_rotated_rect(minRect)){cv::Mat M = cv::getRotationMatrix2D(minRect.center, minRect.angle, 1.0);cv::Mat rotated;// 应用仿射变换 warpAffine,使用三次插值(INTER_CUBIC)图像旋转。旋转结果存储在 rotated 中。cv::warpAffine(cv_src, rotated, M, cv_src.size(), cv::INTER_CUBIC);// 裁剪旋转矩形区域cv::getRectSubPix(rotated, minRect.size, minRect.center, cv_roi);return true;}return false;
}
实现效果:
相关文章:
OpenCV图像处理——按最小外接矩形剪切图像
引言 在图像处理过程中,提取感兴趣区域(ROI)并在其上进行处理后,往往需要将处理后的结果映射回原图像。这一步通常涉及以下几个步骤: 找到最小外接矩形:使用 cv::boundingRect 或 cv::minAreaRect 提取感兴…...
《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(4)-再识Wireshark
1.简介 按照以前的讲解和分享路数,宏哥今天就应该从外观上来讲解WireShark的界面功能了。 2.软件界面 由上到下依次是标题栏、主菜单栏、主菜单工具栏、显示过滤文本框、打开区、最近捕获并保存的文件、捕获区、捕获过滤文本框、本机所有网络接口、学习区及用户指…...
调用yolov3模型进行目标检测
要调用已经训练好的YOLOv3模型对图片进行检测,需要完成以下几个步骤: 加载预训练模型:从预训练的权重文件中加载模型。准备输入图片:将图片转换为模型所需的格式。进行推理:使用模型对图片进行推理,得到检…...
linux文件——重定向原理——dup、重定向与execl、VFS
前言:本篇讲解linux下的重定向相关内容。 在本篇中, 博主将会带着友友们一边实验, 一边探索底层原理。 通过本篇的学习, 友友们将会了解到重定向是如何实现的, 重定向的本质是什么, 重定向和进程替换之间的…...
【STM32 FreeRTOS】任务
使用 RTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行,不依赖于系统内的其他任务或 RTOS 调度器本身。在任何时间点,应用程序中只能执行一个任务,实时 RTOS 调度器负责决定所要执行的任务。因此, R…...
Java面试--框架--Spring MVC
Spring MVC 目录 Spring MVC1.spring mvc简介2.spring mvc实现原理2.1核心组件2.2工作流程 3.RESTful 风格4.Cookie,Session4.1 会话4.2 保存会话的两种技术 5.拦截器5.1过滤器、监听器、拦截器的对比5.2 过滤器的实现5.3 拦截器基本概念5.4 拦截器的实现 1.spring …...
土壤水分监测系统的工作原理
TH-TS200土壤水分监测系统是一种在地球科学、农学等领域广泛应用的分析仪器,它主要用于监测土壤中的水分含量,为农业生产、水资源管理、环境保护等提供重要数据支持。通常包括数据采集器、土壤水分传感器、土壤温度传感器(部分系统配备)、计算机软件以及…...
k8s学习--如何控制pod调度的位置
文章目录 一、Pod 调度基础二、通过节点选择器 (Node Selector) 控制调度三、使用节点亲和性 (Node Affinity)四、使用污点和容忍 (Taints and Tolerations)五、Pod 反亲和性 (Pod Anti-Affinity) 总结 在 Kubernetes (K8s)中,Pod 是应用运行的最小单位࿰…...
基于mysqldump的MySQL数据库异地备份方案(含完整脚本和解释)
MySQL数据库异地备份方案 0 文档描述 本文描述了一个数据库异地备份方案,以下脚本代码都是在线上应用的本文以CentOS7为例,其他系统请自行查询安装命令如果评论有需求,我就对应系统做一下文档 1 基本原理 1.1 流程 原理本身很简单&#…...
C语言中10个字符串函数详解
目录 1.strlen 2.strcpy 3.strcat 4.strcmp 5.strncpy 6.strncat 7.strncmp 8.strstr 9.strtok 10.strerror 1.strlen 基本结构:size_t strlen(const char *str);功能:用于计算字符串的长度;字符串已经 0作为结束标志…...
flume系列之:查询多个flume agent组是否有topic重复接入情况
flume系列之:查询多个flume agent组是否有topic重复接入情况 一、查询zk节点下的flume agent组二、获取采集的topic三、获取重复接入的topic,支持设置重复接入白名单四、执行流程五、完整代码一、查询zk节点下的flume agent组 def get_flumeAgent_zkPath(zkRootPaths):for z…...
Windows自动化1️⃣环境搭建WinAppDriver
对于技术选型: 我尝试了, pywinauto, WinAppDriver,CukeTest 担心CukeTest可能会收费, 尝试pywinauto,在元素点击,搜索时, 遇到不可用情况; WinAppDriver是微软家的,大厂开源, 就它了! 步骤一:安装WinAppDriver 进入WinAppDriver下载页面(https://githu…...
云服务器Docker内部署服务后,端口无法访问?
云服务器Docker内部署服务后,端口无法访问,可以按照以下思路进行排查: 以【docker run --name my-nginx -d -p 9395:80 nginx】举例: 查看Docker映射是否正确,可使用docker ps命令查看。Docker是否设置端口映射&#…...
Unity将摄像机视角保存成Json文件方便读取使用
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、设置环境👉二、代码如下👉三、使用方法 👉四、下次外部调用json里面的摄像机位置的时候如下代码方法👉壁纸分享👉总结 👉…...
git是什么/基本指令
git作用 去中心化, 分布式版本控制器 新增术语:仓库区, 工作区, 暂存区 具体见下板书 常用git命令 git clone 仓库网址 git status 查看仓库状态 git add newfile 临时添加到git仓库 git commit -m 正式添加git仓库 g…...
Linux 中的同步机制
代码基于:Kernel 6.6 临界资源:指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是,如果有线程正在使用,其他进程必须等待直到该线程释放资源。 临界区:指在每个线程中访问临界资源的那段代码。…...
Day17 枚举、typedef、位运算、堆空间的学习
目录 枚举 typedef 位运算 堆上的空间 枚举 一个一个列举出来,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。 作用: 1、为了提高代码的可读性 2、提高代码的安全性 枚举类型 基本语法: enum 枚举名 { …...
Python爬虫与数据分析:中国大学排名的深度挖掘
前言 👉 小编已经为大家准备好了完整的代码和完整的Python学习资料,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费】 一、选题背景 高考作为中国学生生涯中最为重要的事,在高考之后,选择一所…...
微软开源库 Detours 详细介绍与使用实例分享
目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截 C软件异常排查从入门到精通…...
js中的getElementById的使用方法
在JavaScript中,document.getElementById()是一种用于通过元素的id属性获取DOM元素的方法。它的作用是返回与指定id匹配的HTML元素。 使用document.getElementById()可以通过元素的id属性直接获取该元素的引用,然后可以使用该引用对元素进行各种操作。例…...
设计模式 - 桥接模式
💝💝💝首先,欢迎各位来到我的博客!本文深入理解设计模式原理、应用技巧、强调实战操作,提供代码示例和解决方案,适合有一定编程基础并希望提升设计能力的开发者,帮助读者快速掌握并灵活运用设计模式。 💝💝💝如有需要请大家订阅我的专栏【设计模式】哟!我会定…...
LeetCode530 二叉搜索树的最小绝对差
前言 题目: 530. 二叉搜索树的最小绝对差 文档: 代码随想录——二叉搜索树的最小绝对差 编程语言: C 解题状态: 成功解决! 思路 注意题目中的二叉搜索树,这个条件暗示每个节点的左子节点肯定小于该节点&am…...
【STM32 FreeRTOS】信号量与互斥锁
二值信号量 二值信号量的本质是一个队列长度为1的队列,该队列就只有空和满两种情况,这就是二值。 二值信号量通常用于互斥访问或任务同步,与互斥信号量比较类似,但是二值信号量有可能会导致优先级翻转的问题,所以二值…...
SP:eric 靶场复现【附代码】(权限提升)
靶机下载地址: https://www.vulnhub.com/entry/sp-eric,274/https://www.vulnhub.com/entry/sp-eric,274/ 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 08:00:27:75:19:80 1.2. 端口扫描 nmap 192.168.7.104 -p…...
SpringBoot项目启动直接结束--已解决
点击启动类,项目启动了,但是却直接停止了。遇到这个问题如何解决呢? 想要项目一直启动是要部署在tomcat服务器上面了,说明现在项目没有运行在tomcat服务器上面。 解决方案: 添加springweb的starter依赖。 <dependency><…...
【笔记】从零开始做一个精灵龙女-画贴图阶段(下)
补充四点,第一,前期画体积用一号或十三号笔刷,压力60,硬度80,体积大一点 2号笔刷比较适合画过渡和软一点的东东 第二, 游戏里面角色原画海报都是发光很亮很透。但是在bp不能画那么亮,因为你进…...
React 学习——react项目中加入echarts图
实现的代码如下: import * as echarts from echarts import { useEffect, useRef } from react; const Home ()>{const chartRef useRef(null);useEffect(()>{// const chartDom document.getElementById(main);//使用id获取节点const chartDom chartRef…...
链表算法题一
旋转链表 旋转链表 首先考虑特殊情况 若给定链表为空表或者单个节点,则直接返回head,不需要旋转操作.题目给定条件范围: 0 < k < 2 ∗ 1 0 9 0 < k < 2 * 10^9 0<k<2∗109,但是受给定链表长度的限制,比如示例2中,k4与k1的效果等价. 那么可以得出kk%l…...
Unity(2022.3.38LTS) - 基础概念
目录 一. 场景 二. 游戏对象 三. 组件 四. 标签 五. 静态游戏对象 六. 保存 一. 场景 Unity 场景是游戏或应用开发中的一个重要概念。 Unity 场景的组成元素: 它通常包含了各种游戏对象,比如 3D 模型、灯光、摄像机、脚本组件、音频源等等。 作用…...
无人机之飞手必看篇
一、熟悉无人机设备 了解你的无人机:熟悉无人机的各个部分,包括遥控器、电池、螺旋桨和摄像头等。 预飞行检查:在每次飞行前进行预检查,确保所有部件正常工作,螺旋桨牢固,电池充满电。 二、选择适当的飞…...
修改wordpress标题图片/百度seo排名优化价格
Devops一般很少时间会花在数据库的部署上,只有到了不得不去考虑的情况下,才会去考虑如何调整数据库,以适应业务的发展。mongodb本身就很适合Devops,大部分情况下,部署基本按照说明操作一下即可。但实际操作起来&#x…...
深圳做网站优化工资多少/百度助手下载安装
Window对象 Window对象是客户端JavaScript程序的全局对象。 计时器 setTimeout() 和 setInterval() 可以用来注册在指定的时间之后单词或重复调用的函数。 Window对象的setTimeout()方法用来实现一个函数在指定的毫秒之后运行。setTimeout()返回一个值,这个值可以…...
详述电子商务网站的建设/怎么在百度上做广告推广
【例9-23】最长公共子序列【问题描述】w一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X1,x2,…,xm>,则另一序列Z=1,z2,…,zk>是X的子序列是指存在一个严格递增的下…...
合肥模板网站建设费用/如何在各大网站发布信息
////TITLE:// 环境变量和选择性代码编译//AUTHOR:// norains//DATE:// Moday 17-November-2008//Environment:// NONE// 其实这篇文章的完整标题应该是:《PLATFORM BUILDER中的环境变量设置和选择性代码编译》,只是这样似乎有点冗长了。:…...
淘客网站如何做推广/seo招聘要求
1、将所有的.enw文件放在一个文件夹中; 2、利用dos命令copy *.enw new.enw将该文件夹中所有的.enw文件合并为一个new.enw文件; 3、用notepad打开,先用<br>%全部替换%,再用<br>%0全部替换%0,然后把文件另…...
网页设计短期培训/百度关键词优化排名技巧
什么是 Tmux Tmux 官方 Wiki 简单来说,Tmux 是一个能够让你一个窗口当多个窗口使用的终端模拟器。并且你还可以将它放到后台,等到想使用的时候再使用。 为什么要用 Tmux 在服务器上调试程序的时候,经常会打开好几个窗口,并且每个窗…...