首页 > 解决方案 > 二维点的椭圆精度

问题描述

我有一个椭圆,我使用 opencv 从图像中检测到,其中椭圆定义为(x_centre,y_centre),(minor_axis,major_axis),angle. 我还有表格中的点列表,这些点[(x1, y1), (x2,y2), ...]定义了椭圆应该在图像中的位置。

如何从点定义的椭圆中找到找到的椭圆的精度?

更新

为了更好地理解,这是我的实际脚本的结果: 椭圆检测。从图像中检测到红色椭圆,绿点刚刚从文件中加载。

不太准确的例子:椭圆检测 2

我需要一些方法来验证椭圆对外部点的准确度。

标签: pythonopencvimage-processing

解决方案


这个答案描述了一种方法来查找找到的椭圆与由点列表定义的椭圆匹配的准确度。

第一步是创建一个蒙版图像,并在其上绘制椭圆。

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))

推荐阅读