正椭圆的外接矩形可以直接根据椭圆中心以及长短半轴确定,但一般的斜椭圆就要复杂一些,本文记录计算斜椭圆外接矩形的过程。
来自知乎大佬
参数 | 含义 |
---|---|
major_radius | 主轴的半径 |
minor_radius | 短轴半径 |
angle | (顺时针)旋转角度 |
center_x | 中心点横坐标 |
center_y | 中心点纵坐标 |
'''
根据椭圆的主轴和次轴半径以及旋转角度(默认圆心在原点),得到椭圆参数方程的参数,
椭圆参数方程为:
A * x^2 + B * x * y + C * y^2 + D = 0
'''
def get_ellipse_param(major_radius, minor_radius, angle):
a, b = major_radius, minor_radius
sin_theta = np.sin(-angle)
cos_theta = np.cos(-angle)
A = a**2 * sin_theta**2 + b**2 * cos_theta**2
B = 2 * (a**2 - b**2) * sin_theta * cos_theta
C = a**2 * cos_theta**2 + b**2 * sin_theta**2
F = -a**2 * b**2
return A, B, C, D
'''
根据椭圆参数方程的参数,得到椭圆的外接矩形top-left和right-bottom坐标。
'''
def calculate_rectangle(A, B, C, D):
'''
椭圆上下外接点的纵坐标值
'''
y = np.sqrt(4*A*D / (B**2 - 4*A*C))
y1, y2 = -np.abs(y), np.abs(y)
'''
椭圆左右外接点的横坐标值
'''
x = np.sqrt(4*C*D / (B**2 - 4*C*A))
x1, x2 = -np.abs(x), np.abs(x)
return (x1, y1), (x2, y2)
'''
按照数据集接口返回矩形框
'''
def get_rectangle(major_radius, minor_radius, angle, center_x, center_y):
A, B, C, D = get_ellipse_param(major_radius, minor_radius, angle)
p1, p2 = calculate_rectangle(A, B, C, D)
return (center_x+p1[0], center_y+p1[1]), (center_x+p2[0], center_y+p2[1])
from mtutils import ellipse2bbox
bbox = ellipse2bbox(ellipse)