¿Cómo encuentra OpenCV las esquinas del tablero de ajedrez?

Respuestas:

12

El código fuente de OpenCV está disponible, por lo que recomiendo tomarse un tiempo para revisar el código. El archivo relevante para esta función en particular es:

calib3d / src / calibinit.cpp

No lo he investigado en detalle, pero parece que

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

es la implementación principal de este método. Aquí ellos

  1. Úselo cvCheckChessboardpara determinar si hay un tablero de ajedrez en la imagen
  2. Convierte a binario (B y N) y dilata para separar las esquinas
  3. Use icvGenerateQuadspara encontrar los cuadrados.

Luego, el código parece ir a través de un conjunto de controles para condensarlos quadsen las esquinas del tablero de ajedrez, incluidos icvFindConnectedQuads, icvCleanFoundConnectedQuadspara eliminar esquinas adicionales icvCheckQuadGroup, y icvCheckBoardMonotony.

Todas estas funciones se implementan en el mismo archivo, aparte de cvCheckChessboardque está en calib3d / src / checkchessboard.cpp . Dependiendo de qué tan bien quisieras entender el código, parece que hay varias líneas de depuración, que se pueden incluir si lo haces #define DEBUG_CHESSBOARD, que pueden ayudarte a ver lo que está sucediendo.

Chris
fuente
1
Gracias por tu respuesta. Sé que podría buscarlo, pero tenía curiosidad, pero no la suficiente curiosidad para leer el código fuente. Esperaba que alguien descubriera esto en algún momento y pudiera explicar los principios :)
Geerten
1
Encontré un artículo bien escrito ... que también ofrece un método alternativo que es más estable y más rápido (según el autor) researchgate.net/publication/…
philippe