OpenCV3.0:如何使用ArUco库检测正常标记

时间:2016-01-16 16:21:02

标签: c++ opencv aruco

我在opencv3.0中实现了ArUco模块,它在检测aruco标记时完全正常工作。

对于aruco标记检测我正在使用此图像

enter image description here

但是有可能使用aruco模块在图像下方检测这样的正常标记吗?

enter image description here

以下是我的代码的一些片段:

aruco::DetectorParameters detectorParams;
if (parser.has("dp")) {
bool readOk = readDetectorParameters(parser.get<string>("dp"), detectorParams);
    if (!readOk) {
        cerr << "Invalid detector parameters file" << endl;
        return 0;
    }
}

aruco::Dictionary dictionary =
    aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));

Mat camMatrix, distCoeffs;
if (estimatePose) {
    bool readOk = readCameraParameters(parser.get<string>("c"), camMatrix, distCoeffs);
    if (!readOk) {
        cerr << "Invalid camera file" << endl;
        return 0;
    }
}

// detect markers and estimate pose
    aruco::detectMarkers(image, dictionary, corners, ids, detectorParams, rejected);
    if (estimatePose && ids.size() > 0)
        aruco::estimatePoseSingleMarkers(corners, markerLength, camMatrix, distCoeffs, rvecs,
            tvecs);

// draw results
    image.copyTo(imageCopy);
    if (ids.size() > 0) {
        aruco::drawDetectedMarkers(imageCopy, corners, ids);

        if (estimatePose) {
            for (unsigned int i = 0; i < ids.size(); i++)
                aruco::drawAxis(imageCopy, camMatrix, distCoeffs, rvecs[i], tvecs[i],
                    markerLength * 0.5f);
        }
    }

    if (showRejected && rejected.size() > 0)
        aruco::drawDetectedMarkers(imageCopy, rejected, noArray(), Scalar(100, 0, 255));

    imshow("out", imageCopy);
    char key = (char)waitKey(waitTime);
    if (key == 27) break;
}

如何使此代码检测正常标记?

1 个答案:

答案 0 :(得分:0)

FAQ

Should I use a predefined dictionary or generate my own dictionary?
     

通常,使用其中一个预定义词典会更容易。但是,如果您需要更大的字典(根据标记数或位数),您应该生成自己的字典。如果要在识别步骤中最大化标记间距离以实现更好的纠错,字典生成也很有用。

我认为这正是你的情况,你想要使用不在标准ArUco字典中的东西。字典只是class,你需要创建一个字典并用正确的数据填充它。