OpenCV ArUco 标记,如何获得它们的中心?

OpenCV ArUco markers, how to get the center of them?

我正在使用 ArUco 标记,我想获取标记中心的坐标。此方法 detectMarkers() followed by the drawDetectedMarkers() 绘制标记的 Id。看起来单词 "Id" 的左下角像素位于中心。 我怎样才能得到坐标,这样我就可以在不进行姿势估计的情况下将它们打印在我的框架上(如果可能)?

因为你已经有了 4 个顶点,所以中心就是它们的平均值(你也可以在 OpenCV implementation for drawDetectedMarkers 中看到)

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

因此您的代码应如下所示 (see also the tutorial):

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();