Этот ответ описывает один способ выяснить, насколько точно найденный эллипс соответствует эллипсу, как определено списком точек.
Первый шаг - создать изображение маски и нарисовать на нем эллипс.
mask = np.zeros((img.shape[0], img.shape[1]), np.uint8)
mask = cv2.ellipse(mask, ellipse, 255, 5)
Затем повторите список точек и проверьте, находятся ли они в белой или черной части маскирующего изображения.
hit, miss = 0,0
for point in cnt:
if mask[point[0][1], point[0][0]] == 0: miss += 1
else: hit += 1
Это эллипс, который идеально подходит:
Вот эллипс, который не очень хорошо вписывается:
Этот RMSE можно найти с помощью функции cv2.pointsPolygonTest:
_,ellipse_contours,hierarchy = cv2.findContours(mask, 1, 2)
ellipse_contour = ellipse_contours[0]
for point in cnt:
total_dist += cv2.pointPolygonTest(ellipse_contour, tuple(point[0]), True)**2
rmse = math.sqrt(total_dist/len(cnt))