opencv - OpenCV 中 minEnclosingCircle 的意外结果

标签 opencv computer-vision geometry minimum

我最近使用了 OpenCV (2.4.2) 的 minEnclosingCircle 函数,因为我需要测量一团点的直径。

一段时间后我意识到结果不正确,所以我决定编写一个小程序来计算一组非常小的点的直径。

我测试了这个函数:

  • 1个单点
  • 连续 2 - 4 分
  • 仅由 4 个角点组成的不同大小的正方形

在下表中您可以看到我的测试结果:

Note         Diameter           Center                                         Points
1x1             2.000       (1.0, 1.0)                                       [[1, 1]]
2x1             2.000       (1.0, 1.5)                               [[1, 1], [1, 2]]
3x1             2.060       (1.0, 2.0)                       [[1, 1], [1, 2], [1, 3]]
4x1             3.090       (1.0, 2.5)               [[1, 1], [1, 2], [1, 3], [1, 4]]
2x2             2.000       (1.5, 1.5)               [[1, 1], [1, 2], [2, 1], [2, 2]]
3x3             2.913       (2.0, 2.0)               [[1, 1], [1, 3], [3, 1], [3, 3]]
4x4             4.370       (2.5, 2.5)               [[1, 1], [1, 4], [4, 1], [4, 4]]
6x6             7.283       (3.5, 3.5)               [[1, 1], [1, 6], [6, 1], [6, 6]]
8x8            10.196       (4.5, 4.5)               [[1, 1], [1, 8], [8, 1], [8, 8]]
9x9            11.653       (5.0, 5.0)               [[1, 1], [1, 9], [9, 1], [9, 9]]
16x16          21.850       (8.5, 8.5)           [[1, 1], [1, 16], [16, 1], [16, 16]]
10x10          13.110       (5.5, 5.5)           [[1, 1], [1, 10], [10, 1], [10, 10]]
100x100       144.207     (50.5, 50.5)       [[1, 1], [1, 100], [100, 1], [100, 100]]
1000x1000    1455.183   (500.5, 500.5)   [[1, 1], [1, 1000], [1000, 1], [1000, 1000]]

我已经看到函数不会返回小于 1 的半径,所以我得到的最小直径是 2.0。

除此之外,该函数总是返回比我预期的更大的半径。 例如,10x10 正方形的半径约为 12.726 而不是 13.110。 误差随着正方形的大小而增加:对于 1000x1000 的正方形,我期望 1412.5 而不是 1455。

实际上,我意识到相对误差总是在3%左右。

我该如何解释这种奇怪的行为?

最佳答案

我相信,子函数 icvFindEnslosingCicle4pts_32f 中有一个因子 1.03 是错误的——它被乘以半径但再也没有被除。我在 http://code.opencv.org/issues/3362 打开了一个带有简单修复的错误报告。

关于opencv - OpenCV 中 minEnclosingCircle 的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14602124/

相关文章:

python-2.7 - 从图像的边缘检测制作蒙版?

c++ - 如何在目标检测的图像处理中提取模式识别算法中的特定特征?

c++ - opencv:提取区域的方法

algorithm - 给定两个直角棱柱的角点,找到重叠直角棱柱的角点

c# - 贝塞尔曲面中的自动内部边缘

c - 开源拼图 block 生成器

python - 获取许可证OpenCV项目时出错

python - 如何消除数独方 block 中的凸性缺陷?

Python - OpenCV 模块缺少属性 CV_CALIB_FIX_INTRINSIC

visual-studio - OpenCV - 获取视频帧内检测到的图像的法线