OpenCV หามุมกระดานหมากรุกได้อย่างไร


คำตอบ:


12

มีซอร์สโค้ดของ OpenCV ดังนั้นฉันขอแนะนำให้ใช้เวลาสักครู่เพื่ออ่านโค้ด ไฟล์ที่เกี่ยวข้องสำหรับฟังก์ชั่นนี้คือ:

calib3d / src / calibinit.cpp

ฉันไม่ได้ดูรายละเอียด แต่ดูเหมือนว่า

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

เป็นการดำเนินการหลักของวิธีนี้ ที่นี่พวกเขา

  1. ใช้cvCheckChessboardเพื่อกำหนดว่ากระดานหมากรุกอยู่ในรูปภาพหรือไม่
  2. แปลงเป็นไบนารี (B&W) และขยายเพื่อแยกมุมออกจากกัน
  3. ใช้icvGenerateQuadsเพื่อค้นหาช่องสี่เหลี่ยม

รหัสแล้วดูเหมือนว่าจะไปแม้ว่าจะเป็นชุดของการตรวจสอบการรวมตัวเหล่านี้quadsไปยังมุมกระดานหมากรุกรวมทั้งicvFindConnectedQuads, icvCleanFoundConnectedQuadsเพื่อลบมุมพิเศษและicvCheckQuadGroupicvCheckBoardMonotony

ฟังก์ชั่นทั้งหมดเหล่านี้มีการใช้งานในไฟล์เดียวกันนอกเหนือจากcvCheckChessboardที่มีอยู่ calib3d / src / checkchessboard.cpp ขึ้นอยู่กับว่าคุณต้องการทำความเข้าใจกับโค้ดได้ดีเพียงใดมีบรรทัดการดีบักจำนวนหนึ่งซึ่งสามารถรวมได้หากคุณ#define DEBUG_CHESSBOARDซึ่งอาจช่วยให้คุณเห็นสิ่งที่เกิดขึ้น


1
ขอบคุณสำหรับคำตอบ. ฉันรู้ว่าฉันสามารถค้นหาได้ แต่ฉันแค่อยากรู้อยากเห็น แต่ไม่อยากรู้อยากเห็นพอที่จะผ่านซอร์สโค้ด ฉันหวังว่าคนที่คิดออกมานี้บางเวลาและสามารถอธิบายหลักการ :)
Geerten

1
ฉันพบกระดาษเขียนอย่างดี ... ซึ่งมีวิธีการทางเลือกที่เสถียรและเร็วขึ้น (อ้างอิงจากผู้เขียน) researchgate.net/publication/…
philippe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.