VISP中识别AprilTag的C++实例代码解释

接着上一篇:
VISP中识别AprilTag的C++实例代码与运行结果

先展示代码,一句一句解释吧

#include <visp3/detection/vpDetectorAprilTag.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/gui/vpDisplayX.h>
#include <visp3/io/vpImageIo.h>
#include <visp3/core/vpXmlParserCamera.h>int main(int argc, const char **argv)
{#if defined(VISP_HAVE_APRILTAG) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))std::string input_filename = "AprilTag.pgm";vpDetectorAprilTag::vpAprilTagFamily tagFamily = vpDetectorAprilTag::TAG_36h11;vpDetectorAprilTag::vpPoseEstimationMethod poseEstimationMethod = vpDetectorAprilTag::HOMOGRAPHY_VIRTUAL_VS;double tagSize = 0.053;float quad_decimate = 1.0;int nThreads = 1;std::string intrinsic_file = "";std::string camera_name = "";bool display_tag = false;int color_id = -1;unsigned int thickness = 2;bool z_aligned = false;for (int i = 1; i < argc; i++) {if (std::string(argv[i]) == "--pose_method" && i + 1 < argc) {poseEstimationMethod = (vpDetectorAprilTag::vpPoseEstimationMethod)atoi(argv[i + 1]);} else if (std::string(argv[i]) == "--tag_size" && i + 1 < argc) {tagSize = atof(argv[i + 1]);} else if (std::string(argv[i]) == "--input" && i + 1 < argc) {input_filename = std::string(argv[i + 1]);} else if (std::string(argv[i]) == "--quad_decimate" && i + 1 < argc) {quad_decimate = (float)atof(argv[i + 1]);} else if (std::string(argv[i]) == "--nthreads" && i + 1 < argc) {nThreads = atoi(argv[i + 1]);} else if (std::string(argv[i]) == "--intrinsic" && i + 1 < argc) {intrinsic_file = std::string(argv[i + 1]);} else if (std::string(argv[i]) == "--camera_name" && i + 1 < argc) {camera_name = std::string(argv[i + 1]);} else if (std::string(argv[i]) == "--display_tag") {display_tag = true;} else if (std::string(argv[i]) == "--color" && i + 1 < argc) {color_id = atoi(argv[i + 1]);} else if (std::string(argv[i]) == "--thickness" && i + 1 < argc) {thickness = (unsigned int)atoi(argv[i + 1]);} else if (std::string(argv[i]) == "--tag_family" && i + 1 < argc) {tagFamily = (vpDetectorAprilTag::vpAprilTagFamily)atoi(argv[i + 1]);} else if (std::string(argv[i]) == "--z_aligned") {z_aligned = true;} else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {std::cout << "Usage: " << argv[0]<< " [--input <input file>] [--tag_size <tag_size in m>]"" [--quad_decimate <quad_decimate>] [--nthreads <nb>]"" [--intrinsic <intrinsic file>] [--camera_name <camera name>]"" [--pose_method <method> (0: HOMOGRAPHY, 1: HOMOGRAPHY_VIRTUAL_VS, "" 2: DEMENTHON_VIRTUAL_VS, 3: LAGRANGE_VIRTUAL_VS, "" 4: BEST_RESIDUAL_VIRTUAL_VS, 5: HOMOGRAPHY_ORTHOGONAL_ITERATION) (default: 0)]"" [--tag_family <family> (0: TAG_36h11, 1: TAG_36h10 (DEPRECATED), 2: TAG_36ARTOOLKIT (DEPRECATED),"" 3: TAG_25h9, 4: TAG_25h7 (DEPRECATED), 5: TAG_16h5, 6: TAG_CIRCLE21h7, 7: TAG_CIRCLE49h12,"" 8: TAG_CUSTOM48h12, 9: TAG_STANDARD41h12, 10: TAG_STANDARD52h13) (default: 0)]"" [--display_tag] [--color <color_id (0, 1, ...)>]"" [--thickness <thickness>] [--z_aligned]"" [--help]"<< std::endl;return EXIT_SUCCESS;}}vpCameraParameters cam;cam.initPersProjWithoutDistortion(615.1674805, 615.1675415, 312.1889954, 243.4373779);vpXmlParserCamera parser;if (!intrinsic_file.empty() && !camera_name.empty())parser.parse(cam, intrinsic_file, camera_name, vpCameraParameters::perspectiveProjWithoutDistortion);std::cout << cam << std::endl;std::cout << "poseEstimationMethod: " << poseEstimationMethod << std::endl;std::cout << "tagFamily: " << tagFamily << std::endl;std::cout << "nThreads : " << nThreads << std::endl;std::cout << "Z aligned: " << z_aligned << std::endl;try {vpImage<unsigned char> I;vpImageIo::read(I, input_filename);#ifdef VISP_HAVE_X11vpDisplayX d(I);
#elif defined(VISP_HAVE_GDI)vpDisplayGDI d(I);
#elif defined(VISP_HAVE_OPENCV)vpDisplayOpenCV d(I);
#endifvpDetectorAprilTag detector(tagFamily);detector.setAprilTagQuadDecimate(quad_decimate);detector.setAprilTagPoseEstimationMethod(poseEstimationMethod);detector.setAprilTagNbThreads(nThreads);detector.setDisplayTag(display_tag, color_id < 0 ? vpColor::none : vpColor::getColor(color_id), thickness);detector.setZAlignedWithCameraAxis(z_aligned);vpDisplay::display(I);double t = vpTime::measureTimeMs();std::vector<vpHomogeneousMatrix> cMo_vec;detector.detect(I, tagSize, cam, cMo_vec);t = vpTime::measureTimeMs() - t;std::stringstream ss;ss << "Detection time: " << t << " ms for " << detector.getNbObjects() << " tags";vpDisplay::displayText(I, 40, 20, ss.str(), vpColor::red);for (size_t i = 0; i < detector.getNbObjects(); i++) {std::vector<vpImagePoint> p = detector.getPolygon(i);vpRect bbox = detector.getBBox(i);vpDisplay::displayRectangle(I, bbox, vpColor::green);std::string message = detector.getMessage(i);std::size_t tag_id_pos = message.find("id: ");if (tag_id_pos != std::string::npos) {int tag_id = atoi(message.substr(tag_id_pos + 4).c_str());ss.str("");ss << "Tag id: " << tag_id;vpDisplay::displayText(I, (int)(bbox.getTop() - 10), (int)bbox.getLeft(), ss.str(), vpColor::red);}for (size_t j = 0; j < p.size(); j++) {vpDisplay::displayCross(I, p[j], 14, vpColor::red, 3);std::ostringstream number;number << j;vpDisplay::displayText(I, p[j] + vpImagePoint(15, 5), number.str(), vpColor::blue);}}vpDisplay::displayText(I, 20, 20, "Click to display tag poses", vpColor::red);vpDisplay::flush(I);vpDisplay::getClick(I);vpDisplay::display(I);for (size_t i = 0; i < cMo_vec.size(); i++) {vpDisplay::displayFrame(I, cMo_vec[i], cam, tagSize / 2, vpColor::none, 3);}vpDisplay::displayText(I, 20, 20, "Click to quit.", vpColor::red);vpDisplay::flush(I);vpDisplay::getClick(I);} catch (const vpException &e) {std::cerr << "Catch an exception: " << e.getMessage() << std::endl;}return EXIT_SUCCESS;
#else(void)argc;(void)argv;return 0;
#endif
}

首先是vpDetectorAprilTag类的头文件

#include <visp3/detection/vpDetectorAprilTag.h>

下面的main()函数第一句是检测VISP是否已经配置好了第三方库

#if defined(VISP_HAVE_APRILTAG) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))

读入图片之后

vpDetectorAprilTag detector(tagFamily);

下面的功能转换一下图片,加快处理速度

    detector.setAprilTagQuadDecimate(quad_decimate);detector.setAprilTagPoseEstimationMethod(poseEstimationMethod);detector.setAprilTagNbThreads(nThreads);detector.setDisplayTag(display_tag, color_id < 0 ? vpColor::none : vpColor::getColor(color_id), thickness);detector.setZAlignedWithCameraAxis(z_aligned);

下面是为了识别3D姿态

    std::vector<vpHomogeneousMatrix> cMo_vec;detector.detect(I, tagSize, cam, cMo_vec);

下面获取每个标签的框的四个点

      std::vector<vpImagePoint> p = detector.getPolygon(i);vpRect bbox = detector.getBBox(i);

下面返回标签信息

std::string message = detector.getMessage(i);
        std::size_t tag_id_pos = message.find("id: ");if (tag_id_pos != std::string::npos) {int tag_id = atoi(message.substr(tag_id_pos + 4).c_str());ss.str("");ss << "Tag id: " << tag_id;vpDisplay::displayText(I, (int)(bbox.getTop() - 10), (int)bbox.getLeft(), ss.str(), vpColor::red);}

下面把标签3D姿态转换为RGB框架

for (size_t i = 0; i < cMo_vec.size(); i++) {vpDisplay::displayFrame(I, cMo_vec[i], cam, tagSize / 2, vpColor::none, 3);}

Note

To get absolute pose (not relative to a scale factor), you have to provide the real size of the marker (length of a marker side).
需要指出真实大小

To calibrate your camera, you can follow this tutorial: Tutorial: Camera intrinsic calibration
需要标定

ViSP中识别AprilTag的C++实例代码解释相关推荐

  1. ViSP中识别AprilTag的C++实例代码与运行结果

    VISP中识别AprilTag的C++可运行代码与运行结果 Introduction ***具体解释见下一篇:***VISP中识别AprilTag的C++实例代码解释 ***具体帮助开发文档下载:** ...

  2. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  3. html 存储登录状态,Vue中保存用户登录状态实例代码

    首先我们假设,这里的登录组件(register.vue)是App.vue组件的子组件,是通过路由进入登录组件的. 登录组件中用户点击登录后,后台会传过来一个用户名,我的App.vue组件中需要拿到这个 ...

  4. java get null_java 获取对象中为null的字段实例代码

    下面一段简单的代码给大家分享java 获取对象中为null的字段,具体代码如下所述: private static String[] getNullPropertyNames(Object sourc ...

  5. android 方形按钮代码,Android中实现图文并茂的按钮实例代码

    效果图如下所示: 代码: android:orientation="horizontal" android:layout_width="match_parent" ...

  6. linux shell中实现循环日期的实例代码

    这篇文章主要介绍了linux shell中实现循环日期的实例代码,文中还给大家提到了LINUX SHELL遍历日期(指定输入两个日期)的实现方法,感兴趣的朋友跟随小编一起看看吧 下面通过一段代码给大家 ...

  7. oracle 删除表存过,oracle删除数据库中已存在表的实例代码

    摘要 腾兴网为您分享:oracle删除数据库中已存在表的实例代码,长沙银行,银万财富,图钉,听中国等软件知识,以及土豆app,局域网文件,宝宝学动物,观海听涛bbs,育碧,生男生女预测大师,新先视,信 ...

  8. php模拟红绿灯,JS 中使用Promise 实现红绿灯实例代码(demo)

    本文通过实例代码给大家介绍了JS 中使用Promise 实现红绿灯效果,在文中给大家介绍了一个promise用法例子,不了解js中如何使用Promise的朋友可以参考下本篇文章 要求使用promise ...

  9. java获取图片主色_Java获取彩色图像中的主色彩的实例代码

    本文讲述了java获取彩色图像中的主色彩的实例代码.分享给大家供大家参考,具体如下: 一:基本思路 对于一张rgb色彩空间的彩色图像,很多时间我们想通过程序获得该图像有几种主要的色彩,但是对一般图像来 ...

最新文章

  1. IDEA跟Eclipse险些打一架。Maven:都住手,我来一统天下
  2. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow 3.1PlayGround
  3. 预备作业01:你期望的师生关系是什么?
  4. php中的getdate+函数,PHP中的getdate()函数
  5. MySQL里面的in关键字
  6. Java 文件操作一(写文件、按行读文件、删除文件、复制文件、追加数据、创建临时文件、修改最后修改日期、获取文件大小)
  7. jquery实现上下左右键盘监听_基于 jQuery 实现键盘事件监听控件
  8. 循迹小车三个感应c语言程序,循迹小车的C语言程序(带注释)
  9. 身份证号归属地数据库
  10. python函数长度单位换算_长度单位换算表-在线长度单位转换器
  11. OpenXML指定位置插入图片
  12. (待优化)python入门
  13. toDesk 远程连接软件 连接远程电脑后黑屏
  14. 使用pygame实现音乐播放器(一)
  15. windows10安装更新很慢ndows,Windows 10升级太慢了?这里有俩窍门
  16. Aspose.Words for .NET使用章节教程(2):如何处理文档分段——Aspose.Words中的分段
  17. 华为机试--字符串ASC码+偏移量实现加密
  18. 在word 页眉插入章编号+标题
  19. 施一公首部作品:《自我突围:向理想前行》
  20. 认识Kernel 内存泄漏

热门文章

  1. React文档(十四)深入JSX
  2. 科技下的仓库,数据库
  3. FreeBSD手册——配置FreeBSD内核
  4. 这些git技能够你用一年了
  5. redmine 2.2.x 修改文档附件的存放目录
  6. [导入]ZT笑到内伤:史上最雷,最爆寒的电影字幕
  7. hibernate关联关系(多对多)
  8. 分布式文件系统HDFS 练习
  9. 团队冲刺第二阶段-2
  10. Windows10 Postgres11 安装 The Database cluster initialisation failed