OpenCV开发教程之最小外接矩形和最大外接矩形

26人浏览 / 0人评论 / 添加收藏

今天我们来聊一聊最小外接矩形和最大外接矩形。在OpenCV中处理图像轮廓时,boundingRect()minAreaRect()是两种常用且互补的工具。下面我们来深入了解一下它们的具体用法和区别。为了让你能快速抓住重点,这里用一个简单的表格来总结它们的核心区别:

 
 
特征 cv2.boundingRect() (最大外接矩形) cv2.minAreaRect() (最小外接矩形)
官方名称 直边界矩形 (Straight Bounding Rectangle) 旋转矩形 (Rotated Rectangle)
方向 始终与图像坐标轴平行 (Axis-Aligned) 可以旋转,以贴合物体真实方向
返回类型 (x, y, w, h) 四元组 RotatedRect 对象
面积特性 面积不一定最小 面积最小的包围矩形
核心用途 快速定位、区域裁剪、简单检测 获取物体姿态(角度)、精准测量、目标方向分析
视觉比喻 一个正放的、能罩住物体的盒子 一个可以旋转、紧紧贴合物体的盒子

下面我们直接用代码来演示效果:

#最小外接矩形和最大外接矩形
import cv2
import numpy as np

from opencv_jupyter_ui import cv2_imshow


#该图像显示效果是黑白的,但是实际上却是3个通道的彩色图像
img = cv2.imread('./images/hello.png')
#变成单通道的黑白图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#二值化,注意有2个返回值,阈值和结果
ret, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
#轮廓查找,新版本返回两个结果,轮廓和层级,老版本返回3个参数,图像,轮廓和层级
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#打印轮廓
# print(contours)

#rect是一个Rotated Rect 旋转的矩形,矩形的起始坐标(x,y),矩形的长宽,矩形旋转角度
rect = cv2.minAreaRect(contours[1])
print(rect)
box = cv2.boxPoints(rect)
# 坐标必须是整数的,需要转化一下
#四舍五入
box = np.round(box).astype('int64')
print(box)

#绘制最小外接矩形
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)

#最大外接矩形
x,y,w,h = cv2.boundingRect(contours[1])
# print(rect)
#绘制最大外接矩形
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

cv2_imshow('img', img)

运行效果如下:


红色边框是最小外接矩形,蓝色边框是最大外接矩形。

全部评论