opencv中的cv2.minAreaRect函数官方文档如上,没有具体的定义。
这里做一下介绍:
输入:numpy array
输出: ( center (x,y), (width, height), angle of rotation ).即((矩形中心x坐标,矩形中心y坐标),(宽,高),角度)
其中矩形中心x,y坐标很好理解,宽、高和角度则不固定,以下面代码为例:
import cv2
import numpy as np
print(cv2.__version__)
img = np.zeros([1200,1200,3], dtype="uint8")
points = [[589,268], [512,528], [702,534], [740,413]]
# points = [[600,361], [900,570], [800,580], [750,408], [700,100]]
for point in points:
cv2.circle(img, point, 7, (0,0,255), -1)
minRect = cv2.minAreaRect(np.array(points))
box = cv2.boxPoints(minRect).astype('int32')
print(minRect, '\n', box.tolist())
cv2.line(img, (200,box[-1][1]), (1000,box[-1][1]), (255,255,255), 2)
cv2.polylines(img, [box], isClosed=True, color=(0,255,255), thickness=2)
cv2.imwrite('E:\\code\\others\\img.png', img)
输出结果为:
4.6.0
((639.65185546875, 424.4026794433594), (185.958740234375, 271.1623229980469), 16.496856689453125)
[[511, 528], [588, 268], [767, 320], [690, 580]]
注意,我的opencv版本为4.6.0,上图种的θ角和四个顶点为人为添加。
此时,x轴顺时针旋转最先重合的边为w=185.958740234375, 则h=271.1623229980469,angle为x轴顺时针旋转的角度=16.496856689453125,
cv2.boxPoints函数将旋转矩形框的输出转化为矩形框四个顶点,依次为xmin点,顺时针排列;也可理解为最后一个顶点为旋转角所在顶点,顺时针排列。
当输入points为另一场景时:
输出结果为:
4.6.0
((710.6478271484375, 373.02227783203125), (510.7837219238281, 194.21136474609375), 66.94869995117188)
[[521, 176], [700, 100], [900, 570], [721, 646]]
此时长边为w=510.7837219238281, h=194.21136474609375,角度θ=66.94869995117188