最优拟合椭圆框

2022-05-28 16:20:11 浏览数 (2)

代码语言:javascript复制
import cv2
import numpy as np
o=cv2.imread('C:/Users/xpp/Desktop/coins.png')#原始图像
gray=cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)#将彩色图片转换为灰度图片
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)#将灰度图片转换为二值图片
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#计算图像轮廓
n=len(contours)
contoursImg=[]
for i in range(n):
    temp=np.zeros(o.shape,np.uint8)
    contoursImg.append(temp)
cv2.imshow("original",o)
ellipse=cv2.fitEllipse(contours[i])#计算最优拟合椭圆框
print("返回值ellipse:n",ellipse)
cv2.ellipse(o,ellipse,(255,255,255),2)#绘制最优拟合椭圆框
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()

返回值ellipse: ((226.83999633789062, 62.23775100708008), (103.79611206054688, 110.34321594238281), 80.08370208740234

算法:最优拟合椭圆框是计算包围指定轮廓点集的最小外接矩形的中心的坐标、矩形长和宽、旋转角度,与椭圆的中心的坐标、椭圆的长轴和短轴、旋转角度相对应。

retval=cv2.fitEllipse(points)

  • points表示轮廓

img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[,
 thickness[, lineType]])

  • img表示待绘制图像
  • center表示圆心
  • axes表示轴的长度
  • angle表示旋转的角度
  • startAngle表示圆弧起始角的角度
  • endAngle为圆弧终结角的角度
  • color表示绘制颜色
  • thickness表示画笔粗细,可选参数
  • lineType表示绘制线型,可选参数

注意:最优拟合椭圆框通过最小外接矩形得到椭圆,不是直接得到椭圆。矩形是最小外接矩形而不是矩形包围框和最小矩形包围框。通常情况下,椭圆的短轴是长轴的一半长。

0 人点赞