如何使用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()
让我们看一些示例,以获得更清晰的理解。
我们将以下图像作为 输入文件 用于下面的示例。
示例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
我们会得到以下输出窗口 –
用于适应检测到对象的椭圆以红色绘制出来。
让我们找到内含椭圆的旋转矩形。
示例 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 −
椭圆用红色绘制,旋转矩形(最小面积)用黄色绘制。请注意,椭圆被画在旋转矩形内部。