c++ - OpenCV ArUco标记,如何获得它们的中心?
问题描述
我正在使用 ArUco 标记,我想获取标记中心的坐标。此方法detectMarkers()后跟drawDetectedMarkers()绘制标记的 Id。看起来“Id”这个词的左下角像素位于中心。我怎样才能得到坐标,这样我就可以在我的框架上打印它们而不进行姿态估计(如果可能的话)?
解决方案
由于您已经拥有 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();
推荐阅读
- c++ - 防止或检测“this”在使用过程中被删除
- r - 如何通过文件夹创建一个循环以在R中的相应文件夹中写入栅格?
- python - loader 实例 `cdll` 的属性是如何创建的?
- spring-boot - 测试 Spring Boot 休息控制器,无法找到 is() 的包
- php - Laravel 在另一个具有关系的表中的多个链接列?
- r - 用于读取多个 csv (tsv) 文件的 R 进度条
- r - R:修改一个以来自多个先前行的数据为条件的变量
- rest - VSTS 使用 API 在排队时设置构建参数
- android - Android Webview SwipeRefreshLayout 不允许向下滚动
- qt5 - Gumstix Overo SSD1306 OLED