OpenCV - 改进 Charuco 板上标记的检测

4
我正在使用OpenCV的aruco::CharucoBoard对象进行校准,发现其标记检测未能在图像中找到所有可见的标记/角点。
我开始调查此事,并尝试在用于校准的板子图像上检测标记。除非图像大小为640x480,否则aruco::detectMarkers无法检测到所有标记。
我确信需要在aruco::DetectorParameters中进行一些微调,但我还没有找到最佳值。
以下是相关代码:
int nx = 16;
int ny = 10;
double sqrLength = 1.0;
double markerLength = 0.8;
    
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(aruco::DICT_6X6_250);
Ptr<aruco::CharucoBoard> board = aruco::CharucoBoard::create(nx, ny, sqrLength, markerLength, dictionary);
aruco::DetectorParameters params = aruco::DetectorParameters::create();

Mat boardImg;
Size boardImgSize = Size(640 * 2, 480 * 2);
board->draw(boardImgSize, boardImg);

vector<int> markerIds;
vector<vector<Point2f>> markerCorners, rejected;
aruco::detectMarkers(boardImg, board->dictionary, markerCorners, markerIds, params, rejected);
 cout << markerIds.size() << endl;
    aruco::drawDetectedMarkers(boardImg, markerCorners);
imshow("board", boardImg);
waitKey(30);

这个板子上的标记总数为80,上述代码仅适用于Size boardImgSize = Size(640, 480)时发现所有标记。

您有改进检测/调整哪些参数的想法吗?


你能分享一下你说它找不到的图片吗?这样我们就可以用你的图片进行尝试。 - Yunus Temurlenk
1
棋盘的图像是在代码中创建的:board->draw(...) “真实”的图像以*.pgm格式存在。 - Zachi Shtain
1
啊,是的,你说得对,不好意思。 - Yunus Temurlenk
1个回答

0
首先,看起来板子上标记的总数应该是160:nx * ny = 16 * 10 = 160。
但是你遇到的问题与sqrLength和markerLength参数值不正确有关。正如你可以在https://docs.opencv.org/4.5.0/d0/d3c/classcv_1_1aruco_1_1CharucoBoard.html#aa83b0a885d4dd137a41686991f85594c(create()描述)中找到的那样: squareLength是棋盘格方块的边长(通常以米为单位) markerLength是标记的边长(与squareLength相同的单位)
因此,您应该提供从印刷图案测量得出的以米为单位的值。

对于您的情况,最好的选择是测量正方形边长和标记边长,并将其设置为sqrLength和markerLength。例如,如果您的图案印在1x1m的纸上,则值将为: sqrLength = PatternWidth / nx = 1 / 16 = 0.0625 markerLength = sqrLength * 0.8 = 0.0625 * 0.8 = 0.05


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接