我正在使用OpenCV并进行相机校准,这是第一次测试charuco型校准器。
我对这款校准器有很多期望,认为与标准棋盘相比,它可以更接近图像的角落,因为不需要完全看到charuco。从理论上讲,这应该有助于投影系统的建模,因为拐角处的光学变形更大。
我得到的结果让我有些困惑。 interpolateCharucoCorners函数永远不会返回棋盘的最后一行/列,因此无法使用图像的这些区域进行校准。
为了给您一个想法,我附上下图,其中我突出显示了由interpolateCharucoCorners提取的点所描述的区域(该区域是整个点集的凸包)。
Charuco董事会:

如您所见,标记右侧的最后一列尚未提取。您能帮我解释一下原因吗?如何在校准中包括这些像素? ChArUco角如下提取。
那是我的代码,但与示例相同:

image_grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
corners, ids, rejected_points = cv2.aruco.detectMarkers(image_grayscale, board.dictionary)
_, charuco_corners, charuco_ids = cv2.aruco.interpolateCornersCharuco(corners, ids, image_grayscale, board)

最佳答案

我终于找到了解决方案。可以通过在minMarkers = 0中设置参数interpolateCornersChaurco来提取边缘附近的标记。从文档:
MinMarkers:必须检测到以返回charuco角的相邻标记数。
https://docs.opencv.org/3.4/d9/d6a/group__aruco.html#gadcc5dc30c9ad33dcf839e84e8638dcd1
这是结果图像:
opencv - 在图像角落进行相机校准-LMLPHP

07-24 16:50