学习目标

这次学习中将学会下面三部分:

  • 如何使用makeTransformToGlobal计算位姿
  • 如何使用makeCameraPose和Viz3d :: setViewerPose
  • 如何通过轴和视锥显示可视化相机位置

代码

#include <opencv2/viz.hpp>
#include <iostream>
#include <fstream>
using namespace cv;
using namespace std;
static void help()
{cout<< "--------------------------------------------------------------------------"   << endl<< "This program shows how to use makeTransformToGlobal() to compute required pose,"<< "how to use makeCameraPose and Viz3d::setViewerPose. You can observe the scene "<< "from camera point of view (C) or global point of view (G)"                    << endl<< "Usage:"                                                                       << endl<< "./transformations [ G | C ]"                                                 << endl<< endl;
}
static Mat cvcloud_load()
{Mat cloud(1, 1889, CV_32FC3);ifstream ifs("bunny.ply");string str;for(size_t i = 0; i < 12; ++i)getline(ifs, str);Point3f* data = cloud.ptr<cv::Point3f>();float dummy1, dummy2;for(size_t i = 0; i < 1889; ++i)ifs >> data[i].x >> data[i].y >> data[i].z >> dummy1 >> dummy2;cloud *= 5.0f;return cloud;
}
int main(int argn, char **argv)
{help();if (argn < 2){cout << "Missing arguments." << endl;return 1;}bool camera_pov = (argv[1][0] == 'C');viz::Viz3d myWindow("Coordinate Frame");myWindow.showWidget("Coordinate Widget", viz::WCoordinateSystem());Vec3f cam_pos(3.0f,3.0f,3.0f), cam_focal_point(3.0f,3.0f,2.0f), cam_y_dir(-1.0f,0.0f,0.0f);Affine3f cam_pose = viz::makeCameraPose(cam_pos, cam_focal_point, cam_y_dir);Affine3f transform = viz::makeTransformToGlobal(Vec3f(0.0f,-1.0f,0.0f), Vec3f(-1.0f,0.0f,0.0f), Vec3f(0.0f,0.0f,-1.0f), cam_pos);Mat bunny_cloud = cvcloud_load();viz::WCloud cloud_widget(bunny_cloud, viz::Color::green());Affine3f cloud_pose = Affine3f().translate(Vec3f(0.0f,0.0f,3.0f));Affine3f cloud_pose_global = transform * cloud_pose;if (!camera_pov){viz::WCameraPosition cpw(0.5); // Coordinate axesviz::WCameraPosition cpw_frustum(Vec2f(0.889484, 0.523599)); // Camera frustummyWindow.showWidget("CPW", cpw, cam_pose);myWindow.showWidget("CPW_FRUSTUM", cpw_frustum, cam_pose);}myWindow.showWidget("bunny", cloud_widget, cloud_pose_global);if (camera_pov)myWindow.setViewerPose(cam_pose);myWindow.spin();return 0;
}

注释

  • 创建一个可视化窗口
viz::Viz3d myWindow("Transformations");
  • 从摄像机位置,摄像机焦点和y方向获取摄像机位姿
Point3f cam_pos(3.0f,3.0f,3.0f), cam_focal_point(3.0f,3.0f,2.0f), cam_y_dir(-1.0f,0.0f,0.0f);
Affine3f cam_pose = viz::makeCameraPose(cam_pos, cam_focal_point, cam_y_dir);
  • 知道了相机坐标系轴获取变换矩阵
Affine3f transform = viz::makeTransformToGlobal(Vec3f(0.0f,-1.0f,0.0f), Vec3f(-1.0f,0.0f,0.0f), Vec3f(0.0f,0.0f,-1.0f), cam_pos);
  • 从bunny.ply文件创建云部件
Mat bunny_cloud = cvcloud_load();
viz::WCloud cloud_widget(bunny_cloud, viz::Color::green());
  • 已知相机坐标系中的姿势,估计全局姿势
Affine3f cloud_pose = Affine3f().translate(Vec3f(0.0f,0.0f,3.0f));
Affine3f cloud_pose_global = transform * cloud_pose;
  • 如果将视点设置为全局视点,则可视化相机坐标系和视锥
if (!camera_pov)
{viz::WCameraPosition cpw(0.5); // Coordinate axesviz::WCameraPosition cpw_frustum(Vec2f(0.889484, 0.523599)); // Camera frustummyWindow.showWidget("CPW", cpw, cam_pose);myWindow.showWidget("CPW_FRUSTUM", cpw_frustum, cam_pose);
}
  • 使用估计的全局姿势可视化点云部件
myWindow.showWidget("bunny", cloud_widget, cloud_pose_global);
  • 如果将视点设置为相机的视点,则将查看者姿态设置为cam_pose
if (camera_pov)myWindow.setViewerPose(cam_pose);

结果

1、这是从摄像机的角度来看的结果

2、这是从全局角度来看的结果

OpenCV的viz库学习(二)相关推荐

  1. OpenCV与AIPCV库——学习笔记(一)

    本专题是学习Algorithms for Image Processing and Computer Vision的笔记. AIPCV是书名的缩写. 使用OpenCV时,需要了解的关键细节是数据结构的 ...

  2. Echarts开源可视化库学习(二)常用图表的实现与效果

    一.柱状图 一.Echarts最基本的代码结构 <!DOCTYPE html> <html lang="en"><head><meta c ...

  3. OpenCV的viz库学习(一)

    学习目标 这次学习中将学会下面三部分: 添加一些部件到可视化窗口 使用Affine3设置部件的姿势 部件沿轴旋转与平移 代码 #include <opencv2/viz.hpp> #inc ...

  4. TH库学习(二): THTensorApply宏观理解(简化)

    特别说明,本文大多思路和解释都源于: [1] PyTorch源码浅析(一) [2] PyTorch源码浅析(二) [3] tiny_lib TensorApply系列的宏函数是TH实现各种张量元素操作 ...

  5. CMakeLists学习二、链接库搜索路径与ld

    CMakeLists学习二.链接库搜索路径与ld 前言 gcc的链接 gcc链接命令 ld搜索路径 ldconfig刷新动态库缓存 CMakeLists指定链接搜索路径 后记 前言 本文继续CMake ...

  6. Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...

  7. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  8. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

    OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...

  9. OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()

    OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1.connectedComponents() ...

最新文章

  1. 如何在JavaScript中实现链接列表
  2. 肏蛋的Loadrunner脚本
  3. 软工作业——四则运算生成器(scala 实现)
  4. 关于tcp、http可能你想知道的那些事
  5. CentOS下tftp 安装配置使用
  6. python【蓝桥杯vip练习题库】PREV-52小数第n位(模拟)
  7. 深度学习的seq2seq模型——本质是LSTM,训练过程是使得所有样本的p(y1,...,yT‘|x1,...,xT)概率之和最大...
  8. python函数后面两个括号_简单了解为什么python函数后有多个括号
  9. jQuery——子元素筛选器
  10. boost::pool
  11. 解决Vue-Router报错:vue-router.esm.js:17 [vue-router] <router-link>‘s tag prop is deprecated and has been
  12. path的图片下拉效果
  13. python在生活中有哪些用处-Python语言有哪些用途
  14. head first系列pdf下载
  15. 2021年计算机类考研人数,2021年考研79所院校报考人数汇总
  16. Linux使用详解(进阶篇)
  17. 心理学家:人生最可怕的不是失去爱,而是失去这种能力
  18. 张亚勤:微软九成研发资源投入云计算
  19. win7网站服务器空间怎么清理,window_Win7系统如何清理C盘空间?Win7系统清理C盘空间小技巧,  Win7系统清理C盘空间小技 - phpStudy...
  20. Linux-Linux内核-进程调度

热门文章

  1. 原生js实现吸取图片颜色
  2. 释放Windows为硬件保留内存,双系统安装释放法。
  3. Microsoft Solitaire Collection拦截广告
  4. 华为OD-机试(三道)
  5. Rocksdb 写数据流程
  6. 对于pix2pix的介绍以及实现
  7. Linux系统安装Redis以及报错解决方法
  8. 2020邮储实习经验说
  9. tsconfig.json
  10. BES2300x笔记(15) -- 提示音制作秘籍