opencv-python里的minAreaRect,boundingRect和boxPoints函数的使用
最小外接旋转矩形,最小外接正矩形的概念
cv.minAreaRect()—求最小外接旋转矩形的center_x,center_y,w, h,angle
输入参数:[[x1, y1], [x2, y2], [x3, y3], …[xn, yn]]---------------------点集
输出格式:rect = ((center_x, center_y), (w, h), angle)
输入参数是numpy格式,使用np.array()格式转换
angle格式角度制[0, 90], 会有 -0.0的角度(猜测可能是交换w,h引起的,-0.0也对应0度)。
输入:
points1:
[[3979.3120584137123, 3079.8325319735786], [4037.171304326291, 3107.476393909589], [4016.308628316948, 3151.142459975655], [3958.4493824043693, 3123.4985980396445]]
points2:
[[4044.2180426308605, 3034.289607122802], [4084.5274604824476, 3086.5658833990783], [4039.064397419385, 3121.6217392549343], [3998.754979567798, 3069.345462978658]]
输出:
cv.boxPoints()—求最小外接旋转矩形的四个顶点
输入参数:rect = ((center_x, center_y), (w, h), angle)
输出格式:box = ((x1, y1), (x2,y2), (x3, y3), (x4, y4))
center_x, center_y, w, h均为整型。angle格式角度制,opencv的角度angle是根据w算的:一般角度取[-180, 180]之间, 顺时针角度为正,逆时针角度为负。角度关系:α - β = 180 ,如下图所示:
比如:rect = ((center_x, center_y), (w, h), angle) = ((3997, 3115), (64, 48), 26)
angle为26度可以解释为:以长边64(w)顺时针来算角度为26度
把26度换成逆时针角度为26-180 = -154°
((3997, 3115), (64, 48), 26) 和 ((3997, 3115), (64, 48),-154) 得到的box是一样的。只是四个点的顺序变了。顺时针角度的坐标顺序:左下,左上,右上,右下。逆时针角度的坐标顺序:右上,右下,左下,左上。运行结果:
将64和48换一下位置:此时正确的顺时针角度为:26+90=116°, 逆时针角度为:-156 + 90 = -66°
((3997, 3115), (48, 64), 116)和((3997, 3115), (48, 64), -66)结果一致。运行结果:
注意这里只是在说opencv的角度关系。如果选择了自己的标签表示方法,角度区间可以自己定义。
如长边表示法: center_x, center_y, long_w, short_h, angle ,这里的角度可以自己决定选什么区间,一般选择顺时针角度[0,179)或者逆时针角度(-179,0]
如opencv表示法:center_x, center_y, w, h, angle ,这里w和h谁都可以为长边(依据角度换w,h的位置),以w位置的边为计算角度的基准。一般取逆时针角度[-90,0)或者顺时针角度(0,90]。
cv.boundingRect()—求最小外接正矩形的左上坐标x,y,矩形的w,h
输入参数:[[x1, y1], [x2, y2], [x3, y3], …[xn, yn]]----------------------- 点集
输出格式:(left_up_x, left_up_y, w, h)
输入参数是numpy格式,使用np.array()格式转换
输入:
[[3958 3123]
[3979 3079]
[4037 3107]
[4016 3151]]
输出: