如何使用OpenCV Python找到对象的最小外接圆?

如何使用OpenCV Python找到对象的最小外接圆?

一个对象的最小外接圆(外接圆)是一个完全覆盖该对象的圆,其面积最小。我们可以使用函数 cv2.minEnclosingCircle() 找到对象的最小外接圆。

语法

该函数的语法为 –

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

其中 cnt 是轮廓点。它表示为轮廓点数组。

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

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

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 cv2

# 加载输入图像
img = cv2.imread('fourpoint-star.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用二值化将灰度图转换为二进制图像
ret,thresh = cv2.threshold(gray,150,255,0)

# 寻找轮廓线
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的轮廓线数量:" , len(contours))

# 选择第一个轮廓线
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()

我们将使用以下图像作为 输入文件 在此程序中进行处理−

如何使用OpenCV Python找到对象的最小外接圆?

输出

当您执行上述代码时,它将产生以下输出 –

检测到的轮廓线数量:1

我们得到以下输出窗口−

如何使用OpenCV Python找到对象的最小外接圆?

检测到的对象的最小外接圆以绿色绘制。

例2

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

导入 cv2
导入 matplotlib.pyplot 作为 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)
打印("检测到的对象数量:", len(contours))

# 找到图像中所有轮廓的包含圆
对于 cnt 在 轮廓 中:
   (x,y),radius = cv2.minEnclosingCircle(cnt)
   center = (int(x),int(y))
   radius = int(radius)
   img = cv2.circle(img,center,radius,(0,0,255),3)

# 显示图像
cv2.imshow("圆形", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

如何使用OpenCV Python找到对象的最小外接圆?

输出

执行上述代码时,将会产生以下输出

检测到的轮廓数:3

我们得到以下 输出 窗口−

如何使用OpenCV Python找到对象的最小外接圆?

检测到的对象的最小包含圆以红色显示。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV