Como o OpenCV encontra os cantos do tabuleiro de xadrez?

Respostas:

12

O código-fonte do OpenCV está disponível, então eu recomendo levar algum tempo analisando o código. O arquivo relevante para esta função específica é:

calib3d / src / calibinit.cpp

Eu não olhei para ele em detalhes, mas parece que

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

é a principal implementação desse método. Aqui eles

  1. Use cvCheckChessboardpara determinar se um tabuleiro de xadrez está na imagem
  2. Converta em binário (P&B) e dilate para dividir os cantos
  3. Use icvGenerateQuadspara encontrar os quadrados.

O código parece passar por um conjunto de verificações para condensá-las quadsnos cantos do tabuleiro de xadrez, incluindo icvFindConnectedQuads, icvCleanFoundConnectedQuadspara remover cantos extras icvCheckQuadGroup, e icvCheckBoardMonotony.

Todas essas funções são implementadas no mesmo arquivo, além do cvCheckChessboardque está em calib3d / src / checkchessboard.cpp . Dependendo de quão bem você quisesse entender o código, parece haver várias linhas de depuração, que podem ser incluídas se você #define DEBUG_CHESSBOARDajudar a ver o que está acontecendo.

Chris
fonte
11
Obrigado pela sua resposta. Eu sei que poderia procurar, mas fiquei curioso, mas não curioso o suficiente para passar pelo código-fonte. Eu esperava que alguém descobriu isso algum tempo, e poderia explicar os princípios :)
Geerten
11
I Encontrado um papel bem escrito ... que também oferece um método alternativo que é mais estável e mais rápido (de acordo com o autor) researchgate.net/publication/...
Philippe