In che modo OpenCV trova gli angoli della scacchiera?


Risposte:


12

Il codice sorgente di OpenCV è disponibile, quindi ti consiglio di prenderti un po 'di tempo per esaminare il codice. Il file rilevante per questa particolare funzione è:

calib3d / src / calibinit.cpp

Non l'ho esaminato in dettaglio, ma sembra

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

è l'implementazione principale di questo metodo. Qui dentro

  1. Uso cvCheckChessboard per determinare se una scacchiera è nell'immagine
  2. Convertire in binario (B&N) e dilatare per dividere gli angoli
  3. Usa icvGenerateQuadsper trovare i quadrati.

Il codice sembra quindi passare attraverso una serie di controlli per condensarli quadsnegli angoli della scacchiera, incluso icvFindConnectedQuads, icvCleanFoundConnectedQuadsper rimuovere gli angoli extra icvCheckQuadGroup, eicvCheckBoardMonotony .

Tutte queste funzioni sono implementate nello stesso file, eccetto cvCheckChessboardin calib3d / src / checkchessboard.cpp . A seconda di quanto tu abbia voluto capire il codice, sembra che ci siano un certo numero di righe di debug, che possono essere incluse se tu #define DEBUG_CHESSBOARD, che potrebbero aiutarti a vedere cosa sta succedendo.


1
Grazie per la tua risposta. So che potrei cercarlo, ma ero solo curioso, ma non abbastanza curioso da passare attraverso il codice sorgente. Speravo che qualcuno lo avesse capito un po 'di tempo e
avrei

1
Ho trovato un documento ben scritto ... che offre anche un metodo alternativo che è più stabile e più veloce (secondo l'autore) researchgate.net/publication/…
philippe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.