Как OpenCV находит углы шахматной доски?

Ответы:

12

Исходный код OpenCV доступен, поэтому я бы порекомендовал просто потратить некоторое время на его изучение. Соответствующий файл для этой конкретной функции:

calib3d / SRC / calibinit.cpp

Я не рассматривал это подробно, но похоже,

CV_IMPL
int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
                             CvPoint2D32f* out_corners, int* out_corner_count,
                             int flags )

является основной реализацией этого метода. Здесь они

  1. Используйте, cvCheckChessboardчтобы определить, находится ли шахматная доска на изображении
  2. Преобразовать в двоичный (ч / б) и расширить, чтобы разделить углы
  3. Используйте, icvGenerateQuadsчтобы найти квадраты.

Затем код , кажется, идет , хотя множество проверок , чтобы уплотнить их quadsдля шахматной доски углов, в том числе icvFindConnectedQuads, icvCleanFoundConnectedQuadsчтобы удалить лишние углы, icvCheckQuadGroupи icvCheckBoardMonotony.

Все эти функции реализованы в одном файле, кроме cvCheckChessboardкоторого находится в calib3d / src / checkchessboard.cpp . В зависимости от того, насколько хорошо вы хотели понять код, может появиться несколько строк отладки, которые могут быть включены, если вы #define DEBUG_CHESSBOARD, которые могут помочь вам увидеть, что происходит.

Крис
источник
1
Спасибо за Ваш ответ. Я знаю, что могу посмотреть, но мне было просто любопытно, но недостаточно любопытно, чтобы просмотреть исходный код. Я надеялся, что кто-нибудь когда-нибудь это
выяснит
1
Я нашел хорошо написанную статью ... которая также предлагает альтернативный метод, который является более стабильным и быстрым (по мнению автора) researchgate.net/publication/…
philippe