OpenCV 外接矩形框 cv2.boundingRect、cv2.minAreaRect

文章目录

  • cv2.boudingRect
  • cv2.minAreaRect

示意图
OpenCV 外接矩形框 cv2.boundingRect、cv2.minAreaRect_第1张图片

cv2.boudingRect

x,y,w,h = cv2.boundingRect(array)
  • 输入:img/点集

    array Input gray-scale image or 2D point set, stored in std::vector or Mat.

  • 输出:x,y 是矩阵的左上点坐标 w, h是宽度和高度
    是一个未旋转的矩形

cv2.minAreaRect

将2D点集作为输入,并返回一个Box2D结构,其中包括以下详细信息–(中心(x,y),(宽度、高度)、旋转角度)

(center(x,y), (width, height), angle of rotation) = cv2.minAreaRect(points)
  • 输入:点集
  • 输出:(中心(x,y),(宽度、高度)、旋转角度)

但是要绘制一个矩形,我们需要矩形的四个角,因此为了将Box2D结构转换为4个角点,OpenCV提供了另一个函数cv2.boxPoints(),这将Box2D结构作为输入并返回4个角点。4个角点从y最高的点开始按顺时针顺序排列。语法如下:

points = cv2.boxPoints(box)

在绘制矩形之前,需要将4个角点转换为整数类型。可以使用np.int32或者np.int64(不要使用np.int8,因为它允许最大值127并截断)。有时,你可能会看到使用了np.int0,不要混淆,这相当于np.int32或者np.int64,具体取决于你的系统结构。完整的代码如下:

rect = CV2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)

获得四个角点以后,这四个角点从具有最高y的点开始按顺时针顺序排列,如下所示。如果2个点具有相同的最高y,则最右的点是起点。这些点被编号为0,1,2,3(0开始,3结束)。OpenCV 外接矩形框 cv2.boundingRect、cv2.minAreaRect_第2张图片
因此,OpenCV的cv2.minAreaRect()给出的旋转角度实际上是直线(连接起点和终点)与水平线之间的角度,如下所示。OpenCV 外接矩形框 cv2.boundingRect、cv2.minAreaRect_第3张图片
因此角度值始终位于[-90, 0)之间。为什么?因为如果对象旋转超过90°,则使用下一条边来计算与水平面的角度。因此计算出的角度始终位于[-90,0)之间。OpenCV 外接矩形框 cv2.boundingRect、cv2.minAreaRect_第4张图片
实际角度是对象旋转的角度,计算出的角度是cv.minAreaRect()返回的角度。

参考:
https://theailearner.com/tag/cv2-minarearect/

你可能感兴趣的:(图像处理,opencv,python,计算机视觉)