Python-Opencv minAreaRect生成最小外接矩形的一些解释

     刚开始学minAreaRect的时候,以为这个函数的返回值只有四个角点坐标,直到昨天看了一篇blog才知道,它的返回值包含了minAreaRect的全部信息。 

参考blog:https://blog.csdn.net/lanyuelvyun/article/details/76614872

 

一、下面的这个是官网的解释:

  • Python:          retval=cv.minAreaRect(points)

  • 查找包围输入2D点集的最小区域的旋转矩形。该函数计算并返回指定点集的最小面积边界矩形(可能旋转)。开发人员应该记住,当数据接近包含的Mat元素边界时,返回的RotatedRect可以包含负索引。

  • points
  • Input vector of 2D points, stored in std::vector<> or Mat

 

二、minAreaRect返回值的解释

         应用一下代码可以找到灰度图片的cnts:

# 模糊处理
blurred = cv.GaussianBlur(gray, (19, 19), 0)
# 使用otsu查找最佳阈值ret
ret, thresh = cv.threshold(blurred, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
# threshold 二值化处理
thresh = cv.threshold(blurred, ret, 255, cv.THRESH_BINARY_INV)[1]

# find contours in the thresholded image
cnts = cv.findContours(thresh.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]

         然后在for循环里对cnts里的每一个cnt进行遍历操作即可:

for cnt in cnts:
    # compute the center of the contour
    M = cv.moments(cnt)
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])

    # draw the contour and center of the shape on the image
    cv.drawContours(img, [cnt], -1, (0, 255, 0), 2)
    #画中心点
    cv.circle(img, (cX, cY), 7, (0, 0, 0), -1)
    #画轮廓
    cv.putText(img, "center", (cX - 20, cY - 20), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2)


    rect = cv.minAreaRect(cnt)
    print("中心坐标:", rect[0])
    print("宽度:", rect[1][0])
    print("长度:", rect[1][1])
    print("旋转角度:", rect[2])
    box = cv.boxPoints(rect)  # cv.boxPoints(rect) for OpenCV 3.x 获取最小外接矩形的4个顶点
    box = np.int0(box)
    print("四个顶点坐标为;", box)
    draw_img = cv.drawContours(img, [box], -1, (0, 0, 255), 3)

函数 cv2.minAreaRect() 返回一个Box2D结构 rect:(最小外接矩形的中心(x,y),(宽度,高度),旋转角度)。

分别对应于返回值:(rect[0][0],  rect[0][1]),  (rect[1][0],  rect[1][1]),  rect[2] 

 

借用原博主的图片(侵即删):

 

注意 :旋转角度θ是水平轴(x轴)逆时针旋转,与碰到的矩形的第一条边的夹角。并且这个边的边长是width,另一条边边长是height。也就是说,在这里,width与height不是按照长短来定义的。

在opencv中,坐标系原点在左上角,相对于x轴,逆时针旋转角度为负,顺时针旋转角度为正。在这里,θ∈(-90度,0]。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值