首页 > 解决方案 > OpenCV ArUco标记,如何获得它们的中心?

问题描述

我正在使用 ArUco 标记,我想获取标记中心的坐标。此方法detectMarkers()后跟drawDetectedMarkers()绘制标记的 Id。看起来“Id”这个词的左下角像素位于中心。我怎样才能得到坐标,这样我就可以在我的框架上打印它们而不进行姿态估计(如果可能的话)?

标签: c++opencvaruco

解决方案


由于您已经拥有 4 个顶点,因此中心只是它们的平均值(您也可以在OpenCV 实现中drawDetectedMarkers看到)

Point2f cent(0, 0);
for(int p = 0; p < 4; p++)
    cent += currentMarker.ptr< Point2f >(0)[p];
cent = cent / 4.;

所以你的代码应该看起来像(另见教程):

cv::Mat inputImage;
...
std::vector<int> markerIds;
std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates;
cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create();
cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
cv::aruco::detectMarkers(inputImage, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);

// Draw marker centers
cv::Mat outputImage = inputImage.clone();
for(const auto& corners : markerCorners) 
{
    cv::Point2f center(0.f, 0.f);

    // corners.size() == 4
    for(const auto& corner : corners) {
        center += corner;
    }
    center /= 4.f;
    cv::circle(outputImage, center, 3, cv::Scalar(255,0,0));
}

cv::imshow("centers", outputImage);
cv::waitKey();

推荐阅读