Bagaimana OpenCV menemukan sudut papan catur?

Jawaban:

12

Kode sumber OpenCV tersedia, jadi saya sarankan hanya mengambil sedikit waktu melalui kode. File yang relevan untuk fungsi khusus ini adalah:

calib3d / src / calibinit.cpp

Saya belum memeriksanya secara detail, tetapi sepertinya

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

adalah implementasi utama dari metode ini. Di sini mereka

  1. Gunakan cvCheckChessboarduntuk menentukan apakah papan catur ada di gambar
  2. Konversikan ke biner (B&W) dan melebarkan untuk memisahkan sudut
  3. Gunakan icvGenerateQuadsuntuk menemukan kotak.

Kode kemudian tampaknya pergi melalui serangkaian cek untuk memadatkan ini quadske sudut papan catur, termasuk icvFindConnectedQuads, icvCleanFoundConnectedQuadsuntuk menghapus sudut ekstra icvCheckQuadGroup,, dan icvCheckBoardMonotony.

Semua fungsi ini diimplementasikan dalam file yang sama, selain dari cvCheckChessboardyang ada di calib3d / src / checkchessboard.cpp . Tergantung seberapa baik Anda ingin memahami kode tersebut, tampaknya ada sejumlah baris debug, yang dapat dimasukkan jika Anda #define DEBUG_CHESSBOARD, yang dapat membantu Anda melihat apa yang terjadi.

Chris
sumber
1
Terima kasih atas jawaban anda. Saya tahu saya bisa mencarinya, tetapi saya hanya ingin tahu, tetapi tidak cukup penasaran untuk membaca kode sumbernya. Saya berharap seseorang mengetahui hal ini beberapa saat, dan dapat menjelaskan prinsip-prinsip :)
Geerten
1
Saya menemukan makalah yang ditulis dengan baik ... yang juga menawarkan metode alternatif yang lebih stabil dan lebih cepat (menurut penulis) researchgate.net/publication/…
philippe