Jak OpenCV znajduje rogi szachownicy?

Odpowiedzi:

12

Kod źródłowy OpenCV jest dostępny, więc polecam poświęcić mu trochę czasu. Odpowiedni plik dla tej konkretnej funkcji to:

calib3d / src / calibinit.cpp

Nie zagłębiłem się w to szczegółowo, ale wygląda na to

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

jest główną implementacją tej metody. Tutaj oni

  1. Użyj, cvCheckChessboardaby określić, czy szachownica jest na obrazie
  2. Konwertuj na binarny (B&W) i rozszerzaj, aby podzielić rogi na części
  3. Użyj, icvGenerateQuadsaby znaleźć kwadraty.

Wydaje się, że kod przechodzi przez zestaw kontroli, aby skondensować je quadsw rogach szachownicy, w tym icvFindConnectedQuadsw icvCleanFoundConnectedQuadscelu usunięcia dodatkowych narożników icvCheckQuadGroupi icvCheckBoardMonotony.

Wszystkie te funkcje są zaimplementowane w tym samym pliku, oprócz cvCheckChessboardktórego znajduje się w calib3d / src / checkchessboard.cpp . W zależności od tego, jak dobrze chciałeś zrozumieć kod, wydaje się, że istnieje wiele linii debugowania, które mogą być dołączone, jeśli możesz #define DEBUG_CHESSBOARD, które mogą pomóc ci zobaczyć, co się dzieje.

Chris
źródło
1
Dzięki za odpowiedź. Wiem, że mogłem to sprawdzić, ale byłem po prostu ciekawy, ale nie dość, żeby przejrzeć kod źródłowy. Miałem nadzieję, że ktoś to kiedyś wymyślił i mógłbym wyjaśnić zasady :)
Geerten
1
Znalazłem ładnie napisany artykuł ... który oferuje również alternatywną metodę, która jest bardziej stabilna i szybsza (według autora) researchgate.net/publication/...
philpepe