• AprilTags c++识别


    使用开源库:https://github.com/PrieureDeSion/apriltags-cpp

    mTagDetector = new AprilTags::TagDetector(AprilTags::tagCodes25h7);

    string imgpath = "./1.jpg";

    Mat image = imread(imgpath);

    Mat imageGray;

    cv::cvtColor(imageimageGraycv::COLOR_BGR2GRAY);

    vector<AprilTags::TagDetectiondetections = mTagDetector->extractTags(imageGray);

    cout << detections.size() << " tags detected:" << endl;

    for (int i=0idetections.size(); i++) {

       

    }

    //计算坐标与姿态

    Eigen::Vector3d translation;

    Eigen::Matrix3d rotation;

    //fx,fy,px,py相机参数 tagSize标签码尺寸

    detection.getRelativeTranslationRotation(tagSizefxfypxpy,

                                        translationrotation);

    Eigen::Matrix3d F;

      F <<

        1, 0,  0,

        0,  -1,  0,

        0,  0,  1;

    Eigen::Matrix3d fixed = F*rotation;

    double yawpitchroll;

    toEuler(fixed , yawpitchroll);

    qDebug() << "  distance=" << translation.norm()

           << "m, x=" << translation(0)

           << ", y=" << translation(1)

           << ", z=" << translation(2)

           << ", yaw=" << yaw

           << ", pitch=" << pitch

           << ", roll=" << roll;

    //绘制结果

    void drawPred(AprilTags::TagDetectiondetectionMatframe)

    {

        Point a(detection.p[0].firstdetection.p[0].second);

        Point b(detection.p[1].firstdetection.p[1].second);

        Point c(detection.p[2].firstdetection.p[2].second);

        Point d(detection.p[3].firstdetection.p[3].second);

        cv::line(frameabScalar(02550), 2LINE_AA);

        cv::line(framebcScalar(02550), 2LINE_AA);

        cv::line(framecdScalar(02550), 2LINE_AA);

        cv::line(framedaScalar(02550), 2LINE_AA);

        string label = format("%d"detection.id);

        cv::putText(framelabelacv::FONT_HERSHEY_SIMPLEX0.75Scalar(02550), 2);

    }

    void toEuler(const Eigen::Matrix3dwdoubleyawdoublepitchdoubleroll) {

        yaw = rad(atan2(w(1,0)w(0,0)));

        double c = cos(yaw);

        double s = sin(yaw);

        pitch = rad(atan2(-w(2,0)w(0,0)*c + w(1,0)*s));

        roll  = rad(atan2(w(0,2)*s - w(1,2)*c, -w(0,1)*s + w(1,1)*c));

    }

  • 相关阅读:
    Vue 3.0 全家桶 + Vite 从零配置开发环境、生产环境
    Nacos注册中心的部署与用法详细介绍
    快速上手Linux基础开发工具
    面向城市复杂系统的社会计算关键技术研究
    Docker:CentOS7安装Docker
    Layui合计自定义列
    【RS】遥感影像/图片64位、16位(64bit、16bit)的意义和区别
    东华大学Linux实验一
    js:flex弹性布局
    动态库.lib与.dll关系、visual studio工程库路径配置浅析
  • 原文地址:https://blog.csdn.net/shulongjiang/article/details/126617275