https://blog.csdn.net/weixin_37763340/article/details/114339621
(cx,cy), (l,w), theta=cv2.minAreaRect(points)
输入:点集
返回值:中心点坐标->(cx,cy);长宽->(l,w);从x轴逆时针旋转到宽(w)的角度->theta
cv2.boxPoints()可以将minAreaRect的返回值转换为四个角点坐标
sum函数
a.sum()是将矩阵中所有的元素进行求和
a.sum(axis = 0)是普通的相加,即对应列相加
a.sum(axis=1),矩阵中元素行相加
argmin()函数,给出数组中最小值的下标值。
np.roll()函数:
numpy.roll(a, shift, axis=None),a为输入数组,shift为滚动长度,axis为滚动维度,默认为None,即先将数组进行扁平化处理,然后再水平滚动;axis=0,数组垂直方向滚动;axis=1,数组水平方向滚动。
a.reshape(x,y,z):将数组变换为x行,y列,z维的数组,若x或y为-1,代表a数组的行或列数不变。
cv2.polylines()函数:
cv2.polylines()用来画多边形。
- 第1个参数为图像对象;
- 第2个参数为包含一个三元组元素的列表,包含了多边形的各个顶点;
- 第3个参数为Bool型参数表示是否闭合;通常为ture
- 第4个参数为颜色;
- 第5个参数为线条宽度,注意不能使用-1表示填充;
实现代码:
import cv2
imgpath = '1.jpg'
image = cv2.imread(imgpath)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, _ = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cont in contours:
# 对每个轮廓点求最小外接矩形
rect = cv2.minAreaRect(cont)
# cv2.boxPoints可以将轮廓点转换为四个角点坐标
box = cv2.boxPoints(rect)
# 这一步不影响后面的画图,但是可以保证四个角点坐标为顺时针
startidx = box.sum(axis=1).argmin()
box = np.roll(box,4-startidx,0)
# 在原图上画出预测的外接矩形
box = box.reshape((-1,1,2)).astype(np.int32)
cv2.polylines(image,[box],True,(0,255,0),10)
cv2.imshow('ret',image)
cv2.waitKey(0)
输出结果: