opencv-python 轮廓线的最小面积的外接旋转矩形 和 旋转

 

一、函数原型
python
rect = cv2.minAreaRect(points)

输入值:
     points:一个形状为 [-1, 1, 2] 的 NumPy 数组,表示轮廓上的点集。这通常是通过 cv2.findContours 函数从二值图像中检测到的轮廓。
返回值
      cv2.minAreaRect 返回一个 Box2D 对象,该对象包含最小外接矩形的以下信息:

中心点坐标(center):矩形的中心点 (cx, cy)。
宽高(size):矩形的宽度和高度 (width, height)。注意,这里的宽度不一定总是小于高度;矩形的方向是根据其最小面积自动确定的。
旋转角度(angle):矩形短边顺时针旋转此角度,然后平行于水平轴(以度为单位)。角度的范围是 [-90, 0),其中 0 度表示矩形没有旋转(即,与图像的水平轴对齐)。

 

二、将旋转矩阵 旋转,短边与水平轴重合

# -*- coding: utf-8 -*-import cv2
import numpy as np
# 读取图像
img = cv2.imread('D:\Python_OpenCV\SC_vantage\part_temp1.png')
cv2.imshow("Original image", img)
# 应用 Canny 边缘检测
edge_output = cv2.Canny(img, 220, 250)
# 应用高斯模糊
#blurred = cv2.GaussianBlur(img, (3, 3), 0)# 查找轮廓(根据 OpenCV 版本调整返回值)
# 如果您使用的是 OpenCV 4.x,则应该只接收两个返回值
if cv2.__version__.startswith('4.'):contours, hierarchy = cv2.findContours(edge_output, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
else:_, contours, hierarchy = cv2.findContours(edge_output, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#print(contours[0])
# 绘制轮廓
draw_img = img.copy()
#画出原始图像的轮廓
rect_img = cv2.drawContours(draw_img, contours, 0, (0, 0, 255), 2)for  contour in contours:# 取出单个的轮廓值# 根据坐标在图像上画出旋转矩形rect = cv2.minAreaRect(contour)  # 获取最小外接矩阵,中心点坐标,宽高,旋转角度# **********旋转*************
M = cv2.getRotationMatrix2D( rect[0],rect[2]+180,1)#print(M)# 获取矩形四个顶点,浮点型box = cv2.boxPoints(rect)# 创建一个与原始数组行数相同、全为1的列ones_column = np.ones((box.shape[0], 1))# 将原始数组与全1列水平拼接new_box = np.hstack((box, ones_column))# 旋转方式移动坐标点new_box = np.dot( new_box,np.transpose(M) )print(new_box )print(new_box[:,0:2])rect_img  = cv2.drawContours(rect_img,[np.int0(new_box )],0,(0,255,0),2)# **********旋转*************
M = cv2.getRotationMatrix2D(rect[0], rect[2] + 180, 1)# 创建一个与原始数组行数相同、全为1的列print(contour.shape)# 使用 numpy.squeeze() 去除单维度条目contour= np.squeeze(contour, axis=1)  # 你可以指定要去除的轴,但在这里不指定也可以
ones_column = np.ones((contour.shape[0], 1))# 将原始数组与全1列水平拼接_contour = np.hstack((contour, ones_column))# 旋转方式移动坐标点_contour = np.dot( _contour, np.transpose(M))print(_contour)min_rect = cv2.drawContours(rect_img,[np.int0(_contour) ],0,(255,255,0),2)cv2.imshow('Rectangles', rect_img)
cv2.imwrite('D:/Python_OpenCV/SC_vantage/box2.png', rect_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

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

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

相关文章

思科静态路由(包含小实验)

思科静态路由 路由:从源主机到目标主机的转发过程 路由器是根据路由表转发数据 路由表:路由器中维护的路由条目的集合 路由器根据路由表做路径选择 路由表的形成 直连网段 本地接口配置IP地址和子网掩码,端口开启状态,形成直连路由 非直连路由 不是本地接口配置IP地址和子网…

PKUWC2025 D2T1

其实是场上的想到的做法,但是当时被卡 corner case 了 QaQ。 注意到,我们其实可以 \(O(1)\) 次 query 求出 \(x\) 和 \(y\) 的距离。具体地,我们再找三个点,现在有 \(5\) 个点,\(10\) 个距离,而我们又可以 query \(10\) 次,正好可以解出两两距离。这里如果 \(n\le 4\) 特…

MATLAB程序测试

% Interference cancellation % 悦博特北京科技有限公司 lxdawn@163.com %clear all, close all, clctime = 0:0.1:10;r = sin(time*4*pi);% Random initialisation of the W weight and b biasR = length(time); % number of inputsS = R;% p parasite signalp = randn(size(r…

CF998

A link总共就三组,看一下每一组如果满足要让它是多少,看看最多有几个相同的,最多有几个相同的就满足这些,就可以满足这么多组。点击查看代码 #include<bits/stdc++.h>using namespace std;int a[10]; int c[5];void qwq(){cin >> a[1] >> a[2] >> …

计算机网络学习-HCIP-02

TCP、UDP TCP:可靠性高 适合对文件传输的完整性要求高,但是对延迟不敏感 电子邮件 游戏或者应用:更新客户端的时候,就是用TCP协议来更新 游戏更新完了,进去游戏开局了,这时候就用UDP协议 UDP:速度快 双十一、618,电商服务器如何顶住压力的? 使用多台服务器 cdn技术,不…

mybatis的demo程序

事实上,关于mybatis框架的所有过程,均可见于 https://mybatis.net.cn/getting-started.html 一 创建数据库 该部分就是简单的sql语句创建数据库和数据表的过程,不多赘婿,结果如图所示 二 创建maven项目,导入依赖 首先创建maven项目,注意将maven的地址改为自己的maven,而…

lightroom调色笔记

1.关于色彩关系任意两种颜色的混合都会是另一种颜色的互补色 RGB模式下: 红绿混合是黄,黄是蓝色的互补色 蓝绿混合是青色,红色是青色互补色 红蓝混合是品色,品色是绿色的互补色 2.亮度的区域划分3.关于曲线上的锚点 使用ctrl在画面上可以在曲线上找到需要调整的位置 画面偏…

05. 用户组管理

一、什么是用户组管理每一个用户都有一个用户组,系统可以对一个用户组的所有用户进行集中管理。不同 Linux 系统对用户组的规定有所不同。Linux 下的用户属于与它同名的用户组,这个用户组在创建用户时同步创建。用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修…

华为mate70pro+ 对比 小米10ultra 高像素模式

华为 拍摄一张大概要5-7秒 小米 只需不到1秒 华为明显要强华为小米 华为小米

Qt Quick与ROS通过UDP协议实现网络通信

实现目标 项目需要编写一个无人机地面站,无人机在ROS系统下运行,地面站需要与无人机建立通信,能够控制无人机起飞、降落、飞行,并能够接收无人机的状态信息。 该无人机系统的组成如下图所示:地面站通过无线网络与无人机上位机建立通信,上位机负责将飞控的无人机状态数据转…

5.C++提高编程

C++提高编程。C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 例如生活中的模板 一寸照片模板:PPT模板:模板的特点: 模板不可以直接使用,它只是一个框架 模板的通用并不是…

又来新活了!AI电商搜索,或是下一个90亿美元独角兽?

全新体验,大模型驱动的对话式购物搜索。图源:https://www.shopencore.ai/ 全新体验,大模型驱动的对话式购物搜索。 Encore, 由2024年10月成立的美国初创公司开发。定位于二手商品对话式购物搜索,最终目标为个人购物助理。 2024年12月3日获得YC(Y combinator)的50万美元天使…