Aruco码生成、检测测试记录
Aruco码是opencv自带的库,比Apriltag相比,不用额外的编译其他的库,便于部署。
一、Aruco码生成
Vs2019环境下,配置好opencv环境即可,代码如下:
#include <opencv2/opencv.hpp>
#include <opencv2/aruco.hpp>
#include <iostream>
int main() {
// 创建Aruco字典
cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
// 生成单个标记
int markerId = 1; // 标记ID
int markerSize = 400; // 标记大小(像素)
cv::Mat markerImage;
// 生成Aruco码图像
cv::aruco::drawMarker(dictionary, markerId, markerSize, markerImage, 1);
// 显示生成的Aruco码
cv::imshow("Generated Marker", markerImage);
cv::waitKey(0);
// 保存生成的Aruco码到文件
std::string filename = "marker_" + std::to_string(markerId) + ".png";
cv::imwrite(filename, markerImage);
std::cout << "Marker saved as " << filename << std::endl;
return 0;
}
二、检测Aruco码
代码如下:
#include <opencv2/opencv.hpp>
#include <opencv2/aruco.hpp>
#include <iostream>
int main() {
// 创建Aruco字典
cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
// 读取包含Aruco码的图像
std::string imagePath = "D:/work/C++Code/Aruco/Aruco/test.jpg"; // 替换为你的图像路径
cv::Mat image = cv::imread(imagePath);
if (image.empty()) {
std::cerr << "Could not open or find the image!" << std::endl;
return -1;
}
// 检测Aruco码
std::vector<int> ids;
std::vector<std::vector<cv::Point2f>> corners;
cv::aruco::detectMarkers(image, dictionary, corners, ids);
// 绘制检测到的Aruco码边界框
cv::aruco::drawDetectedMarkers(image, corners, ids);
// 输出每个检测到的Aruco码的信息
for (size_t i = 0; i < ids.size(); ++i) {
std::cout << "Marker ID: " << ids[i] << std::endl;
std::cout << "Corner coordinates:" << std::endl;
for (const auto& corner : corners[i]) {
std::cout << "(" << corner.x << ", " << corner.y << ")" << std::endl;
}
std::cout << std::endl;
}
// 显示结果图像
//cv::imshow("Detected Markers", image);
//cv::waitKey(0);
//保存结果图像
cv::imwrite("Output_img.jpg", image);
return 0;
}
运行结果如下图
检测图像如下图