Недавно я использовал функцию minEnclosingCircle OpenCV (2.4.2), потому что мне нужно было измерить диаметры точек.
Через некоторое время я понял, что результаты неверны, поэтому решил написать небольшую процедуру, которая вычисляет диаметры действительно небольшого набора точек.
Я протестировал функцию против:
- 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%.
Как я могу объяснить это странное поведение?