OpenCV 图像最小外包围矩形的绘制及长短边的计算

目录

一、概述

1.1意义

1.2应用

二、代码实现

三、实现效果

3.1原始图像

3.2处理后图像

3.3数据输出


一、概述

          最小外包围矩形(Minimum Bounding Rectangle, MBR)在计算机视觉和图像处理中的意义和应用非常广泛。它是指能够完全包围目标的最小矩形,其主要特性是矩形的面积最小,并且边与目标最紧密。

1.1意义

1.描述性紧凑:最小外包围矩形提供了一种紧凑的方式来描述目标的位置和范围。与边界框不同,最小外包围矩形会根据目标的形状和方向调整自身的角度,从而更贴近目标。
2.旋转不变性:最小外包围矩形能够适应目标的旋转,提供了一种与目标方向无关的边界描述。
3.计算效率计算最小外包围矩形相对高效,且可以为后续的图像处理步骤提供简化数据。

1.2应用

1.目标检测与跟踪:
        检测:通过找到目标的最小外包围矩形,可以更精确地定位目标的位置和方向。
        跟踪:在视频跟踪中,可以使用最小外包围矩形来跟踪目标的变化,包括位置和旋转。
2.形状分析与特征提取:
        方向与角度:通过最小外包围矩形,可以确定目标的主方向和旋转角度。
        形状描述:最小外包围矩形的长宽比可以用于形状分析,帮助区分不同的目标类型。
3.图像裁剪与矫正:

        裁剪:使用最小外包围矩形可以精确地裁剪目标,去除不必要的背景部分。
        矫正:在文档扫描中,可以使用最小外包围矩形来检测并矫正图像的倾斜角度。
4.对象检测前处理:

        在对象检测的前处理中,可以使用最小外包围矩形来规范化目标的位置和方向,从而提高检测算法的准确性。
5.形状拟合:

        在三维重建和点云处理中,最小外包围矩形可以用于拟合形状,简化复杂形状的描述。


二、代码实现

import cv2
import numpy as np
from scipy.spatial import distance# 加载图片
image = cv2.imread('jiaodian.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化处理
_, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY_INV)# 查找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]# 计算最小外接矩形
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)  # 转换为整数# 计算四条边的长度
edges = [np.linalg.norm(box[i] - box[(i + 1) % 4]) for i in range(4)]
longest_edge = max(edges)
shortest_edge = min(edges)# 计算角点之间的距离
dist_matrix = distance.cdist(box, box, 'euclidean')
np.fill_diagonal(dist_matrix, np.inf)  # 防止自己到自己的距离被选中# 找到距离最短的两对角点
min_dist_idx_1 = np.unravel_index(np.argmin(dist_matrix), dist_matrix.shape)
nearest_points_1 = box[list(min_dist_idx_1)]
dist_matrix[min_dist_idx_1] = np.inf  # 将最短距离设为无穷大,以找到第二短的距离min_dist_idx_2 = np.unravel_index(np.argmin(dist_matrix), dist_matrix.shape)
nearest_points_2 = box[list(min_dist_idx_2)]# 绘制结果
for i, point in enumerate(box):cv2.circle(image, tuple(point), 8, (0, 0, 255), -1)cv2.putText(image, chr(65 + i), tuple(point), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 绘制矩形框
cv2.drawContours(image, [box], 0, (0, 255, 0), 2)# 绘制最近的两对点之间的线
cv2.line(image, tuple(nearest_points_1[0]), tuple(nearest_points_1[1]), (0, 0, 255), 3)
cv2.line(image, tuple(nearest_points_2[0]), tuple(nearest_points_2[1]), (0, 0, 255), 3)# 显示结果
cv2.imshow("Min Area Rect", image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 打印结果
print(f"The four corner points of the minimum area bounding box are: {box}")
print(f"Longest edge length: {longest_edge}")
print(f"Shortest edge length: {shortest_edge}")
print(f"The nearest two points are: {nearest_points_1[0]} and {nearest_points_1[1]}")
print(f"Their distance is: {dist_matrix[min_dist_idx_1]}")
print(f"The second nearest two points are: {nearest_points_2[0]} and {nearest_points_2[1]}")
print(f"Their distance is: {dist_matrix[min_dist_idx_2]}")

 代码解释:
1.加载图片并转换为灰度图:使用 cv2.imread 加载图片,使用 cv2.cvtColor 转换为灰度图。
2.二值化处理:使用 cv2.threshold 进行二值化处理,将黑色矩形变为白色区域,背景变为黑色。
3.查找轮廓:使用 cv2.findContours 查找轮廓,并选择第一个轮廓。
4.计算最小外接矩形:使用 cv2.minAreaRect 计算最小外接矩形,并使用 cv2.boxPoints 获取矩形的四个角点。
5.计算四条边的长度:通过计算角点之间的欧几里得距离,找到矩形的四条边的长度。
6.找到最长边和最短边的长度:通过比较边长找到最长边和最短边的长度。
7.计算角点之间的距离:使用 scipy.spatial.distance.cdist 函数计算角点之间的欧几里得距离,并用 np.fill_diagonal 将自己到自己的距离设为无穷大,防止被选中。
8.找到距离最短的两对角点:通过找出距离矩阵中最小的两个值及其索引,确定最近的两对角点。
9.绘制结果:在图像上绘制最小外接矩形、四个角点(用字母标记)和最近的两对角点之间的线,并显示结果。

三、实现效果

3.1原始图像

3.2处理后图像

3.3数据输出

The four corner points of the minimum area bounding box are: [[166 120][705 120][705 320][166 320]]
Longest edge length: 539.0
Shortest edge length: 200.0
The nearest two points are: [166 120] and [166 320]
Their distance is: inf
The second nearest two points are: [705 120] and [705 320]
Their distance is: 200.0

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

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

相关文章

phpexcel导入导出

前言&#xff1a; 如果你到处的excel软件打开有问题&#xff0c;下面有介绍解决办法 导入 1. composer init 初始化 2. 下载phpspreadsheet 这里需要注意php版本&#xff0c;需要大于7.2 composer require phpoffice/phpspreadsheet3. 编写代码 <?php require vendo…

WPF 3D绘图 点云 系列五

基本概念:点云是某个坐标系下的点的数据集。 可能包含丰富的信息,包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等等 点云可以将现实世界原子化,通过高精度的点云数据可以还原现实世界。万物皆点云。 通过三维激光扫描仪进行数据采集获取点云数据,其次通过二维影像进行…

Java | Leetcode Java题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; class Solution {public int rob(int[] nums) {int length nums.length;if (length 1) {return nums[0];} else if (length 2) {return Math.max(nums[0], nums[1]);}return Math.max(robRange(nums, 0, length - 2), robRange(nums, 1,…

小试牛刀-区块链代币锁仓(Web页面)

Welcome to Code Blocks blog 本篇文章主要介绍了 [区跨链代币锁仓(Web页面)] ❤博主广交技术好友&#xff0c;喜欢我的文章的可以关注一下❤ 目录 1.编写目的 2.开发环境 3.实现功能 4.代码实现 4.1 必要文件 4.1.1 ABI Json文件(LockerContractABI.json) 4.2 代码详解…

AI绘画-Stable Diffusion 原理介绍及使用

引言 好像很多朋友对AI绘图有兴趣&#xff0c;AI绘画背后&#xff0c;依旧是大模型的训练。但绘图类AI对计算机显卡有较高要求。建议先了解基本原理及如何使用&#xff0c;在看看如何实现自己垂直行业的绘图AI逻辑。或者作为使用者&#xff0c;调用已有的server接口。 首先需…

单片机软件架构连载(3)-typedef

今天给大家讲typedef&#xff0c;这个关键字在实际产品开发中&#xff0c;也是海量应用。 技术涉及知识点比较多&#xff0c;有些并不常用&#xff0c;我们以贴近实际为原则&#xff0c;让大家把学习时间都花在重点上。 1.typedef的概念 typedef 是 C 语言中的一个关键字&…

DP:背包问题----0/1背包问题

文章目录 &#x1f497;背包问题&#x1f49b;背包问题的变体&#x1f9e1;0/1 背包问题的数学定义&#x1f49a;解决背包问题的方法&#x1f499;例子 &#x1f497;解决背包问题的一般步骤&#xff1f;&#x1f497;例题&#x1f497;总结 ❤️❤️❤️❤️❤️博客主页&…

【RflySim学习笔记】1.RflySim的绪论

目录 文章目录 目录1.RflySim 平台背景2.RflySim 平台特点3.RflySim 平台核心组件介绍3.1 CopterSim3.2 RflySim3D/RflySimUE5UE引擎&#xff1a;RflySim3D/RflySimUE5 3.3 QGroundControl地面站3.4 Python38Env3.5 MATLAB自动代码生成工具箱3.6 SITL/HITL批处理脚本3.7 PX4 Fi…

springboot+vue+mybatis前台点菜系统+PPT+论文+讲解+售后

21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存储达到…

Golang | Leetcode Golang题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; func shortestPalindrome(s string) string {n : len(s)fail : make([]int, n)for i : 0; i < n; i {fail[i] -1}for i : 1; i < n; i {j : fail[i - 1]for j ! -1 && s[j 1] ! s[i] {j fail[j]}if s[j 1] s[i] {fail[i…

SDIO学习(2)--SD 2.0协议

目录 1. SD卡简介 1.1 SD卡概念 1.2 SD卡外形和接口 2. SD 2.0主要特性 3. SD 卡系统概念 3.1 读写属性 3.2 总线拓扑结构 3.2.1 SD模式 3.2.2 SPI模式 3.3 SD 2.0总线协议 3.3.1 命令&#xff08;Command&#xff09; 3.3.1.1 命令分类 3.3.1.2 命令格式 3.3.1.…

精确计算应用的冷启动耗时

在iOS项目中&#xff0c;冷启动时间是指从用户点击应用图标开始&#xff0c;到应用完全加载并呈现出第一个界面&#xff08;可能需要网络请求必要的数据&#xff09;所花费的时间。这里以 main 函数为界&#xff0c;分为两个时间段&#xff1a; 从用户点击应用图标 ~ invoke m…

(4)深入探索与优雅安装:Pandas数据处理的魅力之旅

目录 1. 前言1.1 Pandas 概述1.2 Pandas 特点1.3 优化应用举例1.4 Pandas 应用场景 2. DataFrame2.1 DataFrame结构2.2 Pandas 安装2.2.1 Pandas 安装准备2.2.2 Pandas 安装2.2.3 Pandas 包的导入2.2.4 查看 pandas 版本2.2.5 一个简单的 1. 前言 1.1 Pandas 概述 pandas 是 …

大数据招商的应用场景及实施路径有哪些?

当下&#xff0c;我国已经进入数字经济与实体经济融合发展的新阶段&#xff0c;数字技术和数字化转型落地日臻成熟&#xff0c;数据要素价值释放深入到了我国各个领域的发展&#xff0c;招商引资也不例外&#xff0c;在传统招商模式效果日渐甚微的大环境下&#xff0c;大数据招…

Java 基础知识之 switch 语句和 yield 关键字

传统 switch 语句 传统的 switch 语句我们已经写了一万遍了&#xff0c;以下是一个典型的 switch 语句&#xff1a; int dayOfWeek 3; switch (dayOfWeek) {case 1:System.out.println("星期一");break;case 2:System.out.println("星期二");break;case…

NAT地址转换实验,实验超简单

实验拓扑 实验目的 将内网区域&#xff08;灰色区域&#xff09;的地址转换为172.16.1.0 实验过程 配置静态NAT&#xff08;基于接口的静态NAT&#xff09; R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1]un in en I…

游戏AI的创造思路-技术基础-自然语言处理

自然语言处理-可以对游戏AI特别是RPG类、语言类游戏进行“附魔”&#xff0c;开发出“随机应变”和你聊天的“女友”、“队友”或者是根据你定义的文本库来用接近自然语言的生成“语言”&#xff0c;推动游戏情景在受控范围内前进 目录 1. 自然语言处理定义 2. 发展历史 3. …

泛微开发修炼之旅--26前端j实现手机号码验证

文章链接&#xff1a;26前端j实现手机号码验证

AiPPT的成功之路:PMF付费率与增长策略

如果要给 2023 年的 AI 市场一个关键词&#xff0c;那肯定是“大模型”&#xff0c;聚光灯和大家的注意力、资金都投向了那些大模型公司&#xff1b;而如果要给 2024 年的 AI 市场一个关键词&#xff0c;则一定是 PMF&#xff08;产品市场契合&#xff09;。如果没有 PMF&#…

五粮液:稳,还稳得住吗?

前有“酱香”茅台一骑绝尘&#xff0c;后有“清香”汾酒21%的增速虎视眈眈。 在新的股东大会上&#xff0c;管理层把“稳”字说了近30次。 就问白酒二哥——五粮液&#xff0c;你还稳得住吗&#xff1f; 近期&#xff0c;白酒大哥茅台因跌价吸引各方关注&#xff0c;但在这一…