【发布时间】:2020-10-13 04:02:32
【问题描述】:
我正在使用 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)
【问题讨论】:
-
如果你没有找到知道的人,你仍然可以查看opencv代码(它是开源的),也许可以根据你的需要进行调整。
-
根据文档,当您已经进行校准时,interpilateCharucoCorners 很有用。因为使用针孔相机,您可以正确插入缺失的角。没有针孔摄像头,你无法正确猜测失真,所以无法插值角?!?
-
根据这些图片,似乎希望只检测棋盘的内部(类似于一般棋盘检测):docs.opencv.org/3.4/df/d4a/tutorial_charuco_detection.html
-
谢谢米卡。我认为外部部分也被自动丢弃。这可能是因为只接受 X 形角(90 度白色 + 90 度黑色 + 90 度白色 + 90 度黑色)。但是,如果您查看我的图像,我故意在 FOV 之外留下一列标记,希望使用内部制造商,但它没有用。
-
我刚刚发现参数 minMarkers(必须检测到返回 charuco 角的相邻标记的数量)可以完成这项工作。 docs.opencv.org/3.4/d9/d6a/…。将其设置为零,我解决了我的问题..
标签: opencv calibration aruco