如何使用OpenCV Python将椭圆适配到图像中的对象?

如何使用OpenCV Python将椭圆适配到图像中的对象?

我们可以使用函数 cv2.fitEllipse() 来将椭圆适配到对象上。椭圆被镶嵌在一个旋转矩形内。旋转矩形是一个包含对象的最小区域边界矩形。

语法

此函数使用的语法是-

ellipse = cv2.fitEllipse(cnt)

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

输出 − 它以((x,y),(majorAxis,minorAxis),angle)格式返回元组的元组。 (x,y)是中心的坐标,(majorAxis,minorAxis)是轴的长度,angle是椭圆的旋转角度。

要在输入图像上绘制椭圆,我们使用以下函数-

cv2.ellipse(img,ellipse, (0,0,255), 3)

步骤

您可以使用以下步骤将椭圆适配到对象上-

导入所需的库。在所有以下Python示例中,所需的Python库是 OpenCV 。请确保已经安装了它。

import cv2

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

img = cv2.imread('star1.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.fitEllipse(cnt) ”函数将椭圆适配到对象轮廓“ cnt ”上。

cnt = contours[0]
ellipse = cv2.fitEllipse(cnt)

在输入图像上绘制椭圆。

cv2.ellipse(img,ellipse, (0,0,255), 3)

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

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

让我们看一些示例,以获得更清晰的理解。

我们将以下图像作为 输入文件 用于下面的示例。

如何使用OpenCV Python将椭圆适配到图像中的对象?

示例1

在下面的Python程序中,我们检测图像中对象的轮廓,并找到适合对象的椭圆。我们在输入图像上绘制了椭圆。

# 导入所需库
import cv2
import numpy as np

# 加载输入图像
img = cv2.imread('star1.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]

# 将椭圆拟合到所选对象上
ellipse = cv2.fitEllipse(cnt)

# 在输入图像上绘制椭圆
cv2.ellipse(img,ellipse, (0,0,255), 3)

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

输出结果

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

检测到的轮廓数量:1

我们会得到以下输出窗口 –

如何使用OpenCV Python将椭圆适配到图像中的对象?

用于适应检测到对象的椭圆以红色绘制出来。

让我们找到内含椭圆的旋转矩形。

示例 2

在此Python程序中,我们检测图像中物体的轮廓并找到适应该物体的椭圆。我们还找到内含椭圆的旋转矩形,并在输入图像上绘制了椭圆和旋转矩形。

# 导入必要的库
import cv2
import numpy as np

# 加载输入图像
img = cv2.imread('star1.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]

# 查找最小面积矩形
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img,[box],0,(0,255,255),2)

# 拟合椭圆
ellipse = cv2.fitEllipse(cnt)
cv2.ellipse(img,ellipse, (0,0,255), 3)

# 显示带有椭圆的图像
cv2.imshow("ellipse", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出

当我们执行上面的代码时,它将产生以下输出−

检测到的轮廓数: 1

我们得到以下输出window −

如何使用OpenCV Python将椭圆适配到图像中的对象?

椭圆用红色绘制,旋转矩形(最小面积)用黄色绘制。请注意,椭圆被画在旋转矩形内部。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV