自己写简单的aruco二维码检测代码

自己写简单的aruco二维码检测代码

我让chatgpt写了下,感觉还是挺棒的,这样可以做到自己写aruco二维码检测了

当然根本还是opencv有现成的aruco的函数了

输入图片说明

#include <opencv2/opencv.hpp>
#include <opencv2/aruco.hpp>
​
int main()
{
    // 定义ArUco字典和参数
    cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
    cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create();
​
    // 读取相机标定参数
    cv::FileStorage fs("calibration.xml", cv::FileStorage::READ);
    cv::Mat cameraMatrix, distCoeffs;
    fs["camera_matrix"] >> cameraMatrix;
    fs["distortion_coefficients"] >> distCoeffs;
​
    // 打开相机
    cv::VideoCapture cap(0);
    if (!cap.isOpened())
    {
        std::cout << "无法打开相机" << std::endl;
        return -1;
    }
​
    while (true)
    {
        // 读取相机帧
        cv::Mat frame;
        cap >> frame;
​
        // 转换为灰度图像
        cv::Mat gray;
        cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
​
        // 检测ArUco二维码
        std::vector<int> markerIds;
        std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates;
        cv::aruco::detectMarkers(gray, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);
​
        // 绘制检测结果
        if (markerIds.size() > 0)
        {
            cv::aruco::drawDetectedMarkers(frame, markerCorners, markerIds);
​
            // 估计相机姿态
            std::vector<cv::Vec3d> rvecs, tvecs;
            cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs);
​
            // 绘制相对位姿
            for (int i = 0; i < markerIds.size(); ++i)
            {
                cv::aruco::drawAxis(frame, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 0.1);
            }
        }
​
        // 显示图像
        cv::imshow("ArUco Detection", frame);
​
        // 按下 'q' 键退出循环
        if (cv::waitKey(1) == 'q')
        {
            break;
        }
    }
​
    // 释放资源
    cap.release();
    cv::destroyAllWindows();
​
    return 0;
}

输入图片说明

g++ -o aruco_detection aruco_detection.cpp `pkg-config --cflags --libs opencv4`

输入图片说明

改成这样后运行起来了

#include <opencv2/opencv.hpp>
#include <opencv2/aruco.hpp>
​
int main()
{
    // 定义ArUco字典和参数
    cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
    cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create();
​
    // 读取相机标定参数
    //cv::FileStorage fs("calibration.xml", cv::FileStorage::READ);
    //cv::Mat cameraMatrix, distCoeffs;
    //fs["camera_matrix"] >> cameraMatrix;
    //fs["distortion_coefficients"] >> distCoeffs;
    double fx = 406.932130;
    double fy = 402.678201;
    double cx = 316.629381;
    double cy = 242.533947;
​
    double k1 = 0.039106;
    double k2 = -0.056494;
    double p1 = -0.000824;
    double p2 = 0.092161;
    double k3 = 0.0;
​
    cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << 
    fx, 0, cx,
    0, fy, cy,
    0, 0, 1);
​
    cv::Mat distCoeffs = (cv::Mat_<double>(5, 1) << k1, k2, p1, p2, k3);
​
​
    // 打开相机
    cv::VideoCapture cap(0);
    if (!cap.isOpened())
    {
        std::cout << "无法打开相机" << std::endl;
        return -1;
    }
​
    while (true)
    {
        // 读取相机帧
        cv::Mat frame;
        cap >> frame;
​
        // 转换为灰度图像
        cv::Mat gray;
        cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
​
        // 检测ArUco二维码
        std::vector<int> markerIds;
        std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates;
        cv::aruco::detectMarkers(gray, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);
​
        // 绘制检测结果
        if (markerIds.size() > 0)
        {
            cv::aruco::drawDetectedMarkers(frame, markerCorners, markerIds);
​
            // 估计相机姿态
            std::vector<cv::Vec3d> rvecs, tvecs;
            cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs);
​
            // 绘制相对位姿
            for (int i = 0; i < markerIds.size(); ++i)
            {
                cv::aruco::drawAxis(frame, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 0.1);
            }
        }
​
        // 显示图像
        cv::imshow("ArUco Detection", frame);
​
        // 按下 'q' 键退出循环
        if (cv::waitKey(1) == 'q')
        {
            break;
        }
    }
​
    // 释放资源
    cap.release();
    cv::destroyAllWindows();
​
    return 0;
}
​
​

输入图片说明

输入图片说明

加上结果打印

输入图片说明

边长改正确之后检测的距离也基本是准确的

输入图片说明

输入图片说明

代码最后我放这里了 https://gitee.com/maxibooksiyi/aruco_detection_without_ros

自己写T265定点,自己写aruco二维码检测,自己写摄像头读取,都没有那么难其实。

下面是一个使用 OpenCV 和 Python 的示例代码,用于测量二维码的距离: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread("qrcode.jpg") # 初始化 ArUco 检测aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_1000) parameters = cv2.aruco.DetectorParameters_create() # 检测二维码 corners, ids, rejectedImgPoints = cv2.aruco.detectMarkers(image, aruco_dict, parameters=parameters) # 绘制检测到的二维码 image_markers = cv2.aruco.drawDetectedMarkers(image.copy(), corners, ids) # 计算二维码中心点坐标 center = np.mean(corners[0], axis=0) # 计算二维码距离 focal_length = 1000 # 相机的焦距 marker_size = 0.05 # 二维码的实际大小(米) image_width = image.shape[1] # 图像宽度(像素) distance = (marker_size * focal_length) / (corners[0][0][2] * 2 / image_width) # 在图像上绘制距离 cv2.putText(image_markers, "{:.2f}m".format(distance), tuple(center.astype(int)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 显示结果 cv2.imshow("Markers", image_markers) cv2.waitKey(0) ``` 解释一下代码: 1. 首先读取图像。 2. 然后初始化 ArUco 检测器,使用 DICT_6X6_1000 字典来检测二维码。 3. 调用 `cv2.aruco.detectMarkers` 函数检测图像中的二维码。 4. 使用 `cv2.aruco.drawDetectedMarkers` 函数绘制检测到的二维码。 5. 计算二维码中心点坐标,即四个角点的平均值。 6. 计算二维码距离,根据相机的焦距、二维码的实际大小和图像中二维码的像素大小计算得出。 7. 在图像上绘制距离,使用 `cv2.putText` 函数绘制距离值。 8. 最后显示结果,按下任意键退出。 注意:这段代码假设只检测到了一个二维码,如果检测到多个二维码,需要对每个二维码进行上述计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值