如何在 OpenCV Python 中找到物体的最小外接圆?


物体的最小外接圆(外接圆)是一个完全覆盖物体且面积最小的圆。我们可以使用函数cv2.minEnclosingCircle()来找到物体的最小外接圆。

语法

此函数的语法如下:

(x,y),radius = cv2.minEnclosingCircle(cnt)

其中,“cnt”是轮廓点。它表示为轮廓点的数组。

输出 - 它返回中心坐标 (x,y) 和最小外接圆的半径。(x,y) 和半径为浮点类型。因此,要在图像上绘制圆圈,我们将它们转换为整数。

要绘制最小外接圆,我们使用与在图像上绘制圆圈的函数相同的函数:

cv2.circle(img,center,radius,(0,255,0),2)

步骤

您可以使用以下步骤来找到物体的最小外接圆:

导入所需的库。在以下所有 Python 示例中,所需的 Python 库为OpenCV。确保您已安装它。

import cv2

使用cv2.imread()读取输入图像并将其转换为灰度图像。这里我们加载一个名为fourpoint-star.png的图像。

img = cv2.imread('fourpoint-star.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

对灰度图像应用阈值处理以创建二值图像。调整第二个参数以获得更好的轮廓检测。

ret,thresh = cv2.threshold(gray,150,255,0)

使用cv2.findContours()函数查找图像中的轮廓。

contours, _ = cv2.findContours(thresh,  cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

选择一个轮廓 cnt 或循环遍历所有轮廓。使用 cv2.minEnclosingCircle(cnt) 函数查找轮廓 cnt 的最小外接圆。

cnt = contours[0]
(x,y),radius = cv2.minEnclosingCircle(cnt)

将中心和半径传递给以下函数,在输入图像上绘制最小外接圆。第三个和第四个参数是绘制的圆圈的颜色和粗细。

center = (int(x),int(y))
radius = int(radius)
cv2.circle(img,center,radius,(0,255,0),2)

显示带有绘制的凸包的图像。

cv2.imshow("Circle", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

让我们看一些示例以更清楚地理解。

示例 1

在下面的 Python 程序中,我们检测图像中物体的轮廓并找到物体的最小外接圆。我们还在输入图像上绘制最小外接圆。

# import required libraries import cv2 # load the input image img = cv2.imread('fourpoint-star.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # apply thresholding to convert grayscale to binary image ret,thresh = cv2.threshold(gray,150,255,0) # find the contours contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) print("Number of contours detected:", len(contours)) # select the first contour cnt = contours[0] # find the minimum enclosing circle (x,y),radius = cv2.minEnclosingCircle(cnt) # convert the radius and center to integer number center = (int(x),int(y)) radius = int(radius) # Draw the enclosing circle on the image cv2.circle(img,center,radius,(0,255,0),2) cv2.imshow("Circle", img) cv2.waitKey(0) cv2.destroyAllWindows()

我们将在本程序中使用此图像作为输入文件

输出

执行上述代码后,将产生以下输出:

Number of contours detected: 1

并且,我们将获得以下输出窗口:

检测到的物体的最小外接圆以绿色绘制。

示例 2

在此示例中,我们检测图像中物体的轮廓并找到物体的最小外接圆。我们还在输入图像上绘制所有最小外接圆。

import cv2 import matplotlib.pyplot as plt img = cv2.imread('shape.png') img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(img1,150,255,0) contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) print("Number of objects detected:", len(contours)) # find the enclosing circle for all the contours in the image for cnt in contours: (x,y),radius = cv2.minEnclosingCircle(cnt) center = (int(x),int(y)) radius = int(radius) img = cv2.circle(img,center,radius,(0,0,255),3) # Display the image cv2.imshow("Circle", img) cv2.waitKey(0) cv2.destroyAllWindows()

我们将在本程序中使用此图像作为输入文件

输出

当我们执行上述代码时,它将产生以下输出:

Number of contours detected: 3

并且我们将获得以下输出窗口:

检测到的物体的最小外接圆以红色显示。

更新于: 2022年9月28日

3K+ 浏览量

启动您的职业生涯

通过完成课程获得认证

开始
广告