OpenCV如何找到棋盘角?

信息处理 图像处理 opencv
2021-12-29 09:55:16

OpenCV 函数findChessboardCorners的内部工作原理是什么?

1个回答

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多余的角icvCheckQuadGroup,和icvCheckBoardMonotony

所有这些功能都在同一个文件中实现,除了cvCheckChessboardcalib3d/src/checkchessboard.cpp中。根据您对代码的理解程度,似乎有许多调试行,如果您可以包含#define DEBUG_CHESSBOARD,这可能有助于您了解发生了什么。