我正在尝试为这张图片找到一个角落。这个角对我来说似乎足够清晰,但由于某种原因,算法似乎没有得到正确的结果。
我一直在使用可用的旋钮(终止标准、窗口大小和零区域(虽然不太确定这意味着什么,文档没有说太多)),我觉得我已经快到了,但还没有完全实现。任何指导将不胜感激。
cv::TermCriteria criteria = cv::TermCriteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, 30, 0.1);
cv::cornerSubPix(image_gray, corners, cv::Size(10, 10) /*windows size*/, cv::Size(-1,-1) /*zero zone*/, criteria);
更新1:
这是原始图像,属于使用以下参数生成的 Charuco 板 行= 19,列24,square_width = 0.05,marker_width = 0.04,字典= 5x5_1000,启用legacy_charuco标志
cv::aruco::Dictionary dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_5X5_1000);
cv::Ptr<cv::aruco::CharucoBoard> board = cv::makePtr<cv::aruco::CharucoBoard>(cv::Size(19, 34), 0.05f, 0.04f, dictionary);
board->setLegacyPattern(true);
OpenCV 提供的 charuco/aruco 检测器无法找到左上角的交点和边缘处的其他一些角点(可能是因为边缘处的大部分 aruco 标记被遮挡)
我要做的就是首先计算校准矩阵(按照 Charuco 检测教程中的说明使用
cv::calibrateCamera
),然后重新投影这些点(因为给定 Charuco 板,角是已知的)并查看它落在哪里。例如,对于图像中的点,重投影点落在 (141, 74)
中,距离实际位置 (157, 82)
仅有几个像素,所以我继续使用 cv::cornerSubPix
,这似乎是下一个合乎逻辑的步骤,但令我惊讶的是, cornerSubPix
没有找到正确的拐角,因为拐角并不难找到,我想说,我没有使用正确的参数。
(我也尝试了
cv::findChessboardCorners
,但似乎裁剪边缘效果不好)
https://docs.opencv.org/3.4/df/d4a/tutorial_charuco_detection.html
我认为 Charuco 探测器无法找到右上角,因为那些 aruco 被遮挡了。