OpenCV:绘制图像中mask的最小外接矩形

在计算机视觉和图像处理中,我们经常需要计算直线与外接矩形边的交点。这在进行边缘检测、图像分割、目标跟踪等任务时非常有用。本文将介绍如何使用OpenCV和NumPy计算直线与外接矩形边的交点,并展示如何在实际图像中绘制直线。

1.使用OpenCV读取图像

import cv2
import numpy as np# 读取二值图像
img = cv2.imread('./111.png', cv2.IMREAD_GRAYSCALE)

2.寻找图像中的轮廓

使用OpenCV的findContours函数寻找图像中的轮廓。这里我们选择RETR_EXTERNAL表示只检测最外层轮廓,CHAIN_APPROX_SIMPLE表示压缩水平、垂直和对角线方向的元素,只保留它们的终点坐标。

# 寻找轮廓
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

3.获取最大轮廓

找到所有轮廓后,我们选择面积最大的轮廓,即目标物体所在的区域。

# 获取最大轮廓(白色区域)
max_contour = max(contours, key=cv2.contourArea)

4.计算最小外接矩形

使用minAreaRect函数计算最小外接矩形的信息,包括中心点、尺寸和旋转角度。

# 计算最小外接矩形
rect = cv2.minAreaRect(max_contour)
box = cv2.boxPoints(rect)
box = np.intp(box)

5.在原图上绘制最小外接矩形

使用minAreaRect函数计算最小外接矩形的信息,包括中心点、尺寸和旋转角度。

# 在原图上绘制最小外接矩形
result_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.drawContours(result_img, [box], 0, (0, 255, 0), 2)

完整demo如下

import cv2
import numpy as np# 读取二值图像
img = cv2.imread('./111.png', cv2.IMREAD_GRAYSCALE)# 寻找轮廓
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 获取最大轮廓(白色区域)
max_contour = max(contours, key=cv2.contourArea)# 计算最小外接矩形
rect = cv2.minAreaRect(max_contour)
box = cv2.boxPoints(rect)
box = np.intp(box)# 在原图上绘制最小外接矩形
result_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.drawContours(result_img, [box], 0, (0, 255, 0), 2)
cv2.imshow('result', result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()# 计算外接矩形的 y 方向上的长度
center, size, angle = rect
width, height = size# 计算直线与外接框的上边和下边的交点
x_pos = int(center[0])
y_pos_top = int(center[1] - height / 2)
y_pos_bottom = int(center[1] + height / 2)# 计算直线的两个端点与外接矩形的边相交
line_top = ((x_pos, y_pos_top), (x_pos, y_pos_top + height))
line_bottom = ((x_pos, y_pos_bottom), (x_pos, y_pos_bottom - height))# 计算直线与外接矩形边的交点
intersection_top = (x_pos, max(y_pos_top, min(y_pos_bottom, box[2][1])))
intersection_bottom = (x_pos, max(y_pos_top, min(y_pos_bottom, box[1][1])))# 如果直线直接与外接矩形相交,交点就是直线的起点或者结束点
start_point = intersection_top if intersection_top in line_top else line_top[0]
end_point = intersection_bottom if intersection_bottom in line_bottom else line_bottom[0]# 绘制直线
cv2.line(result_img, start_point, end_point, (0, 0, 255), 2)# 显示图像
cv2.imshow('result', result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

本文详细介绍了使用OpenCV进行图像处理的一系列步骤,包括读取图像、寻找轮廓、计算最小外接矩形和绘制相交直线。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第2章-神经网络的数学基础——python深度学习

第2章 神经网络的数学基础 2.1 初识神经网络 我们来看一个具体的神经网络示例,使用 Python 的 Keras 库 来学习手写数字分类。 我们这里要解决的问题是, 将手写数字的灰度图像(28 像素28 像素)划分到 10 个类别 中(0…

基于多种CNN模型在清华新闻语料分类效果上的对比

该实验项目目录如图: 1、 模型 1.1. TextCNN # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as npclass Config(object):"""配置参数"""def __init__(self, dataset, embedd…

java中如何使用Lambda表达式(一)

什么是Lambda表达式 Lambda 表达式(lambda expression)是一个匿名函数,基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个没有函数名的函数。Lambda表达式可以表…

【C++类与对象(上)】

C类与对象(上) 1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符4.2 封装 5.类的作用域6.类的实例化7.类的对象大小的计算7.1如何计算类对象的大小7.2 类对象的存储方式猜测7.3结构体内存对齐规则 8.类成员函数的this指针8.1…

Java多线程基础-18:线程安全的集合类与ConcurrentHashMap

Java标准库提供了很多集合类,但有一些集合类是线程不安全的,也就是说,在多线程环境下可能会出问题的。常用的ArrayList,LinkedList,HashMap,PriorityQueue等都是线程不安全的(Vector, Stack, Ha…

Android创建工程

语言选择Java,我用的Java 最小SDK:就是开发的APP支持的最小安卓版本 Gradle 是一款Google 推出的基于 JVM、通用灵活的项目构建工具,支持 Maven,JCenter 多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml 文件,转而…

关于ArcGIS的Update更新工具的疑问

Update更新工具官方帮助文件解释如下: 但是根据这个插图很让人疑惑,输入要素是蓝色,更新要素是黄色,输出要素为绿色,而且全部是绿色。我一直以为是与更新要素相交(被包含切割)的哪些输入要素都被…

【常用工具】7-Zip 解/压缩软件——基本使用方法

在实际日常工作或项目中,经常会遇到需要在window操作系统上压缩文件,在Linux操作系统上解压缩的场景,一款实用的压缩软件迫在眉睫,经过实际使用总结,7-Zip可以很好的解决很多压缩和解压缩问题,其基本使用方…

WordPress如何自定义日期和时间格式?附PHP日期和时间格式字符串

WordPress网站在很多地方都需要用到日期和时间,那么我们应该在哪里设置日期和时间呢?又如何自定义日期和时间格式呢?下面boke112百科就跟大家一起来学习一下PHP标准化的日期和时间格式字符串。 特别说明:格式字符是标准化的&#…

canvas绘制旋转的大风车

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

LCweekly-game

ExScorecomplete situation1220717/719(解答错误)30523/537(超时,弱智题已AC)40 有用的是Ex2和Ex4 Ex2 my solution class Solution { public://calculate xs l-time 幂乘int jiecheng(int x,int l){int zx;for(int i0;i<l;i){if(z>pow(10,4.5))return 0;zz*z;}return…

C#算法(11)—求三个点构成圆的圆心坐标和半径

前言 我们在上位机开发领域也经常会碰到根据三个点求出圆的圆形、半径等信息的场景,本文就是详细的介绍如何根据三个点使用C#代码求出三点构成的圆的圆心坐标、圆半径、三点构成的圆弧的角度。 1、3点求圆分析 A、B、C三个点都是圆上的坐标点,过向量AB做中垂线,过向量AC做…

What is `@Scheduled` does?

Scheduled 是Spring框架中用于定时任务调度的注解&#xff0c;它允许我们在类的方法上声明一个方法作为定时任务&#xff0c;由Spring容器统一管理和执行。使用此注解后&#xff0c;Spring会根据注解中的属性配置&#xff0c;按照指定的时间规则自动调用该方法。 public class…

文心一言 VS ChatGPT :谁是更好的选择?

前言 目前各种大模型、人工智能相关内容覆盖了朋友圈已经各种媒体平台&#xff0c;对于Ai目前来看只能说各有千秋。GPT的算法迭代是最先进的&#xff0c;但是它毕竟属于国外产品&#xff0c;有着网络限制、注册限制、会员费高昂等弊端&#xff0c;难以让国内用户享受。文心一言…

「优选算法刷题」:比特位计数

一、题目 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0 --> 0 1…

ESP32 定时器和消息队列

简介 本章涉及知识点&#xff1a;ESP32通用定时器、日志输出&#xff0c;FreeRTOS消息队列。 实现功能&#xff1a;使用ESP32通用定时器实现每1S打印输出日志以及每1Min打印输出日志。 ESP-IDF版本&#xff1a;V5.1.2 源码 DesktopScreen 6 Timer&消息队列小智学长的源码&a…

2023年度AI盘点 AIGC|AGI|ChatGPT|人工智能大模型

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 2023年是人工智能大语言模型大爆发的一年&#xff0c;一些概念和英文缩写也在这一年里集中出现&#xff0c;很容易混淆&#xff0c;甚至把人搞懵。 文章目录 前言01 《ChatGPT 驱动软件开…

使用一个定时器(timer_fd)管理多个定时事件

使用一个定时器(timer_fd)管理多个定时事件 使用 timerfd_xxx 系列函数可以很方便的与 select、poll、epoll 等IO复用函数相结合&#xff0c;实现基于事件的定时器功能。大体上有两种实现思路&#xff1a; 为每个定时事件创建一个 timer_fd&#xff0c;绑定对应的定时回调函数…

QEMU源码全解析41 —— Machine(11)

接前一篇文章&#xff1a;QEMU源码全解析40 —— Machine&#xff08;10&#xff09; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 时间过去了几…

go语言(二十一)---- channel的关闭

channel不像文件一样需要经常去关闭&#xff0c;只有当你确实没有任何发送数据了&#xff0c;或者你想显示的结束range循环之类的&#xff0c;才去关闭channel。关闭channel后&#xff0c;无法向channel再发送数据&#xff0c;&#xff08;引发pannic错误后&#xff0c;导致接收…