【问题标题】:OpenCV - Improving marker detection on Charuco boardOpenCV - 改进 Charuco 板上的标记检测
【发布时间】:2021-06-09 04:59:54
【问题描述】:

我正在使用 OpenCV 的 aruco::CharucoBoard 对象进行校准,并注意到它的标记检测没有找到图像中的所有可见标记/角。

我开始调查此事,并试图检测为校准而打印的电路板图像上的标记。 aruco::detectMarkers 无法检测到所有标记,除非图像大小为 640x480。 我确信需要对 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)

关于如何改进检测/应该调整哪些参数的任何想法?

【问题讨论】:

  • 你能分享你说它找不到的图像吗?所以我们可以试试你的图片
  • 在代码中创建板的图像:board-&gt;draw(...)“真实”图像是*.pgm格式
  • 啊,是的,你是对的,对不起

标签: c++ opencv camera-calibration aruco


【解决方案1】:

首先,棋盘上的标记总数应该是 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 是棋盘的正方形边长(通常以米为单位)

ma​​rkerLength 是标记边长(与 squareLength 单位相同)

因此您应该提供以米为单位的值,这些值是从印刷图案中测量出来的。

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

【讨论】:

    猜你喜欢
    • 2022-10-12
    • 1970-01-01
    • 2015-04-09
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多