aruco :: detectMarkers没有找到标记的真正边缘

时间:2016-12-09 01:46:13

标签: opencv aruco

我使用ArUco标记来校正透视并计算图像中的尺寸。在这张图片中,我知道标记的外边缘之间的确切距离,并使用它来计算黑色矩形的大小。

我的问题是aruco::detectMarkers并不总是识别标记的真实边缘(如详细图片所示)。当我根据标记的角来校正透视时,会导致失真,影响图像中对象的大小计算。

有没有办法提高aruco::detectMarkers的边缘检测准确度?

这是整个董事会的缩小照片:

Marker board

这里是左下角标记的详细信息,显示边缘检测的不准确性:

Lower-left marker

这里是右上角标记的详细信息,显示了相同标记ID的准确边缘检测:

enter image description here

在这张缩小的图像中很难看到,但左上角的标记是准确的,而右下角的标记是不准确的。

我调用detectMarkers的函数:

bool findMarkers(const Mat image, Point2d outerMarkerCoordinates[], Point2d innerMarkerCoordinates[], Size2d *boardSize) {
    Ptr<aruco::Dictionary> theDictionary = aruco::getPredefinedDictionary(aruco::DICT_4X4_1000);
    vector<vector<Point2f> > markers;
    vector<int> ids;

    aruco::detectMarkers(image, theDictionary, markers, ids);

    aruco::drawDetectedMarkers(image, markers, ids);

    return true; //There's actually more code here that makes sure there are four markers.
}

1 个答案:

答案 0 :(得分:4)

optional detectorParameters argumentdetectMarkers的检查显示了一个名为doCornerRefinement的参数。它的描述是&#34;做子像素细化或不做&#34;。由于我看到的错误大于一个像素,我不认为这适用于我的情况。无论如何我试了一下并尝试了cornerRefinementWinSize值,发现它确实解决了我的问题。现在我正在思考&#34;像素&#34;在ArUco意义上,是标记内的一个正方形的大小,而不是图像像素。

detectMarkers的修改调用:

bool findMarkers(const Mat image, Point2d outerMarkerCoordinates[], Point2d innerMarkerCoordinates[], Size2d *boardSize) {
    Ptr<aruco::Dictionary> theDictionary = aruco::getPredefinedDictionary(aruco::DICT_4X4_1000);
    vector<vector<Point2f> > markers;
    vector<int> ids;
    Ptr<aruco::DetectorParameters> detectorParameters = new aruco::DetectorParameters;

    detectorParameters->doCornerRefinement = true;
    detectorParameters->cornerRefinementWinSize = 11;       

    aruco::detectMarkers(image, theDictionary, markers, ids, detectorParameters);

    aruco::drawDetectedMarkers(image, markers, ids);

    return true; //There's actually more code here that makes sure there are four markers.
}

成功!

Edges correctly identified