Як 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. Перетворити на двійкові (B&W) і розширити, щоб розділити кути на частини
  3. Використовуйте icvGenerateQuadsдля пошуку квадратів.

Потім код , здається, йде , хоча безліч перевірок , щоб ущільнити їх quadsдля шахової дошки кутів, в тому числі icvFindConnectedQuads, icvCleanFoundConnectedQuadsщоб видалити зайві кути, icvCheckQuadGroupі icvCheckBoardMonotony.

Усі ці функції реалізовані в одному файлі, крім cvCheckChessboardякого знаходиться у calib3d / src / checkchessboard.cpp . Залежно від того, наскільки добре ви хотіли зрозуміти код, начебто існує ряд рядків налагодження, які можна включити, якщо ви #define DEBUG_CHESSBOARD, що може допомогти вам побачити, що відбувається.


1
Дякую за вашу відповідь. Я знаю, що міг би це подивитися, але мені було просто цікаво, але не досить цікаво, щоб пройти вихідний код. Я сподівався, що хтось придумає це деякий час, і міг би пояснити принципи :)
Geerten

1
Я знайшов добре написаний документ ... який також пропонує альтернативний метод, який є більш стабільним і швидшим (за словами автора) researchgate.net/publication/…
philippe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.