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接口。 首先需…

掌握Mojolicious会话管理:构建安全、持久的Web应用

掌握Mojolicious会话管理&#xff1a;构建安全、持久的Web应用 Mojolicious是一个基于Perl的高性能、异步Web开发框架&#xff0c;它提供了一套完整的工具来构建现代Web应用。会话管理是Web开发中的一个关键组成部分&#xff0c;它允许应用识别和保持用户的登录状态。本文将深…

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

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

WhatsApp机器人:提升客户服务效率的自动化工具

在数字化转型的浪潮中&#xff0c;客户服务领域正经历着一场革命。WhatsApp机器人以其即时性、便捷性和高效性&#xff0c;正在成为企业提升客户服务效率的有力工具。 引言 客户服务是企业与用户建立信任和忠诚度的关键环节。然而&#xff0c;随着用户基数的增长&#xff0c;…

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…

vue+js 监听组合按键 比如ctrl+f

vuejs 监听组合按键 比如ctrlf 需求&#xff1a;页面中有一个搜索功能&#xff0c;增加快捷键触发 <template><div id"app" ></div> </template><script> export default {mounted() {window.addEventListener(keydown, this.copyTe…

CentOS 7 arm64架构制作openssl 1.1.1w 二进制rpm包——筑梦之路

制作过程几乎和这篇CentOS 7 制作openssl 1.1.1w 版本rpm包 —— 筑梦之路_centos7 openssl 1.1.1 rpm包-CSDN博客 无差别&#xff0c;因此不再赘述。 本次制作主要修改了spec文件&#xff0c;将openssl安装路径修改为/usr/local/openssl。 2024年7月3日 二进制rpm包和src…

vue3实现多表头列表el-table,拖拽,鼠标滑轮滚动条优化

需求背景解决效果index.vue 需求背景 需要实现多表头列表的用户体验优化 解决效果 index.vue <!--/** * author: liuk * date: 2024-07-03 * describe:**** 多表头列表 */--> <template><el-table ref"tableRef" height"calc(100% - 80px)&qu…

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

21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#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…

单片机cmake使用笔记

一、同时拥有两个工程项目时的配置&#xff08;APP IAP&#xff09;方便git等工具的管理 1.1、目录结构如下&#xff1a; |-Power_prj|-CMakelists.txt| |-Power_APP| | |-src| | |-include| | |-main.c| | …

(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 是 …