一、函数原型
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()