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;
}

运行结果如下图
在这里插入图片描述
检测图像如下图
在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐