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();
我正在使用 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();