1.最小外接矩形
1. 读取图像并转换为灰度图
im = cv2.imread("yy.png") im1 = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im
读取的是彩色图像。im1
是将im
转换为灰度图的结果。灰度图简化了图像信息,适合进行轮廓检测等操作。
2. 查找轮廓
contours, _ = cv2.findContours(im1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours
保存了图像中所有找到的轮廓,每个轮廓是一个点集。cv2.RETR_TREE
提供了完整的轮廓嵌套信息,cv2.CHAIN_APPROX_SIMPLE
优化了轮廓存储,仅保留必要的点。
3. 计算最小外接矩形
box = cv2.minAreaRect(contours[0])
contours[0]
代表第一个轮廓。cv2.minAreaRect
计算轮廓的最小外接矩形。它返回一个box
,包含矩形的中心坐标、宽高和旋转角度。
4. 获取矩形的四个顶点并进行坐标处理
box = cv2.boxPoints(box) box = np.intp(np.round(box)) box = np.expand_dims(box, 0)
cv2.boxPoints
获取矩形的四个角点坐标。np.round(box)
将坐标四舍五入,确保为整数。np.intp
将坐标转换为整型数组,便于绘图。np.expand_dims(box, 0)
为绘制轮廓添加维度,使box
的形状符合drawContours
的输入要求。
5. 绘制最小外接矩形
cv2.drawContours(im, box, -1, (0, 0, 255), 1, cv2.LINE_AA)
- 在图像
im
上绘制box
的轮廓。 -1
表示绘制整个轮廓。(0, 0, 255)
指定轮廓颜色为红色。1
设置线条的粗细。cv2.LINE_AA
为抗锯齿线,使矩形边缘更平滑。
2. 最大外接矩形
1. 读取图像并转换为灰度图
im = cv2.imread("yy.png") im1 = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im
读取的是彩色图像。im1
是将im
转换为灰度图的结果。灰度图简化了图像信息,适合进行轮廓检测等操作。
2. 查找轮廓
contours, _ = cv2.findContours(im1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours
是一个包含所有轮廓的列表,每个轮廓表示为一组点的集合。cv2.RETR_TREE
用于检索图像中所有的轮廓层次结构,cv2.CHAIN_APPROX_SIMPLE
会压缩轮廓点数据,只保留关键点,从而减少存储空间。
3. 计算水平外接矩形的坐标和尺寸
x, y, w, h = cv2.boundingRect(contours[0])
cv2.boundingRect
计算水平外接矩形,该矩形是能完全包围contours[0]
的最小矩形。- 返回值:
x, y
:矩形左上角的坐标。w, h
:矩形的宽度和高度。
4. 绘制矩形
cv2.rectangle(im, (x, y), (x + w, y + h), (255, 0, 0), 2, cv2.LINE_AA)
cv2.rectangle
在图像im
上绘制矩形。(x, y)
:左上角坐标。(x + w, y + h)
:右下角坐标(通过左上角坐标和宽高计算得到)。(255, 0, 0)
:矩形颜色,这里为蓝色。2
:矩形边框的厚度。cv2.LINE_AA
:抗锯齿效果,使边缘更平滑。
水平外接矩形是沿图像坐标轴的矩形框,简单而高效,适用于大多数情况。
适合对规则形状和固定方向的目标物体进行包围,但如果物体是倾斜或不规则形状,最小外接矩形可能更加精准。