当前位置: 首页 > 工具软件 > Rosin > 使用案例 >

椭圆检测-点到椭圆的近似距离(Rosin distance)

东门越
2023-12-01

参考文献: P. L. Rosin, “A note on the least squares fitting of ellipses,” Pattern Recognition Letters, vol. 14, no. 10, pp. 799–808, 1993.

源码:This is the source code for the paper [Arc-support Line Segments Revisited: An Efficient and High-quality Ellipse Detection]

GitHub - AlanLuSun/High-quality-ellipse-detection: A high-quality ellipse detector based on arc-support line segments which can both accurately and efficiently detect ellipses in images.

/*----------------------------------------------------------------------------*/
/** Approximate the distance between a point and an ellipse using Rosin distance.
 */
#define DBL_MAX          1.7976931348623158e+308 // max value
inline double d_rosin(double* param, double x, double y)
{
	double ae2 = param[2] * param[2];
	double be2 = param[3] * param[3];
	x = x - param[0];
	y = y - param[1];
	double xp = x * cos(-param[4]) - y * sin(-param[4]);
	double yp = x * sin(-param[4]) + y * cos(-param[4]);
	double fe2;
	fe2 = ae2 - be2;
	double X = xp * xp;
	double Y = yp * yp;
	double delta = (X + Y + fe2) * (X + Y + fe2) - 4 * X * fe2;
	double A = (X + Y + fe2 - sqrt(delta)) / 2.0;
	double ah = sqrt(A);
	double bh2 = fe2 - A;
	double term = (A * be2 + ae2 * bh2);
	double xi = ah * sqrt(ae2 * (be2 + bh2) / term);
	double yi = param[3] * sqrt(bh2 * (ae2 - A) / term);
	double d[4], dmin;


	d[0] = dist(xp, yp, xi, yi);
	d[1] = dist(xp, yp, xi, -yi);
	d[2] = dist(xp, yp, -xi, yi);
	d[3] = dist(xp, yp, -xi, -yi);
	dmin = DBL_MAX;
	for (int i = 0; i < 4; i++)
	{
		if (d[i] <= dmin)
			dmin = d[i];
	}
	//  if (X+Y>xi*xi+yi*yi)
	//    return dmin;
	//  else return -dmin; 
	return dmin;
}

 类似资料: