OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓

时间:2023-12-23 10:37:08

本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl

使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg

OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓

代码如下:

import cv2
import numpy as np

# img = cv2.imread('lightning.jpg',0)

img = cv2.imread('Mjolnir.jpg',cv2.IMREAD_UNCHANGED)
# img = cv2.pyrUp(img)
img_gray = cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY)

ret, re_img = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(re_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for c in contours:
    # # find bounding box coordinates
    # # 现计算出一个简单的边界框,c为图像轮廓findContours返回值
    x, y, w, h = cv2.boundingRect(c)   # 将轮廓信息转换成(x, y)坐标,并加上矩形的高度和宽度
    # # print(cv2.boundingRect(c))

    cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2)  # 画出矩形
    # print(help(cv2.rectangle))

    # # find minimum area
    # # 计算包围目标的最小矩形区域
    # rect = cv2.minAreaRect(c)
    # # print(help(cv2.minAreaRect))

    # # calculate coordinate of the minimum area rectangle
    # box = cv2.boxPoints(rect)
    # # print(help(cv2.boxPoints))
    # # normalize coordinates to integers
    # box =np.int64(box)
    # # 注:OpenCV没有函数能直接从轮廓信息中计算出最小矩形顶点的坐标。所以需要计算出最小矩形区域,
    # # 然后计算这个矩形的顶点。由于计算出来的顶点坐标是浮点型,但是所得像素的坐标值是整数(不能获取像素的一部分),
    # # 所以需要做一个转换
    # # draw contours
    # cv2.drawContours(img, [box], 0, (0, 0, 255), 3)  # 画出该矩形

    # calculate center and radius of minimum enclosing circle
    # 会返回一个二元组,
    # 第一个元素为圆心的坐标组成的元组,第二个元素为圆的半径值。
    # (x, y), radius = cv2.minEnclosingCircle(c)
    # # 转为整数 cast to integers
    # center = (int(x), int(y))
    # radius = int(radius)
    # # 绘圆 draw the circle
    # img = cv2.circle(img, center, radius, (0, 255, 0), thickness=2,lineType=8,shift=6)
    # print(help(cv2.circle))

cv2.drawContours(img, contours, -1, (255, 0, 0), 1)
cv2.imshow("contours", img)
cv2.waitKey()
cv2.destroyAllWindows()

运行如下

OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓

该部分代码与

OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法

中最后一部分全代码分析内容相同。