Wie findet OpenCV Schachbrettecken?


Antworten:


12

Der Quellcode von OpenCV ist verfügbar, daher würde ich empfehlen, sich etwas Zeit zu nehmen, um den Code durchzugehen. Die relevante Datei für diese bestimmte Funktion lautet:

calib3d / src / calibinit.cpp

Ich habe es nicht im Detail untersucht, aber es sieht so aus

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

ist die Hauptimplementierung dieser Methode. Hier drin sie

  1. Verwenden Sie cvCheckChessboarddiese Option, um festzustellen, ob sich ein Schachbrett im Bild befindet
  2. In Binär (Schwarzweiß) konvertieren und erweitern, um die Ecken zu teilen
  3. Verwenden Sie icvGenerateQuads, um die Quadrate zu finden.

Der Code scheint dann eine Reihe von Überprüfungen zu durchlaufen, um diese quadsauf Schachbrettecken zu verdichten , einschließlich icvFindConnectedQuads, icvCleanFoundConnectedQuadsum zusätzliche Ecken zu entfernen icvCheckQuadGroup, und icvCheckBoardMonotony.

Alle diese Funktionen sind in derselben Datei implementiert, außer cvCheckChessboardin calib3d / src / checkchessboard.cpp . Je nachdem, wie gut Sie den Code verstehen wollten, scheint es eine Reihe von Debugging-Zeilen zu geben, die enthalten sein können, wenn Sie dies #define DEBUG_CHESSBOARDtun, um zu sehen, was los ist.


1
Danke für deine Antwort. Ich weiß, ich könnte es nachschlagen, aber ich war nur neugierig, aber nicht neugierig genug, um den Quellcode durchzugehen. Ich hoffte, dass jemand dies irgendwann herausfand und die Prinzipien erklären konnte :)
Geerten

1
Ich habe eine schön geschriebene Arbeit gefunden ... die auch eine alternative Methode bietet, die stabiler und schneller ist (laut Autor) researchgate.net/publication/…
philippe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.