学习目标

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

  • 如何使用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. Kylin集群部署和cube使用
  2. u-boot启动过程
  3. python开源报表系统_流程设计器、表单设计器和简单报表管理开源OA系统smart-web...
  4. linux下搭建vnc服务器,linux下搭建Vncserver
  5. CodeForces - 1017D The Wu
  6. 大话Linux内核中锁机制之原子操作、自旋锁【转】
  7. 二开版彩虹易支付全开源10套模板带风控实名系统源码
  8. 微信小程序中如何有效的修改app.js中全局变量的值,并能在页面中进行动态响应
  9. eXo Platform 3.0访谈
  10. Pta——敲笨钟,制定位置输出字符串
  11. 美颜sdk版本是什么意思?如何选择第三方美颜sdk?
  12. 2019数博会参会嘉宾数量、层级、范围创历届新高,全球领袖级企业竞相亮相
  13. 符号的英文读法(转)
  14. TBR架构的一些理解
  15. 学计算机买华为还是买华硕,不考虑爱国因素,联想、华为、华硕等哪个品牌的笔记本电脑较好?...
  16. 台式电脑计算机风机,笔记本冷却风扇与台式计算机CPU风扇的质量,类型和区别...
  17. 2021年G1工业锅炉司炉考试资料及G1工业锅炉司炉考试试卷
  18. 手机中的那些人机交互都是怎么实现的
  19. Android学习之AlarmManager使用
  20. 软件项目管理作业(一):如何学好项目管理课程

热门文章

  1. 微服务SpringCloud Alibaba架构
  2. 计算机视觉论文速递(四)Dynamic Sparse R-CNN:Sparse R-CNN升级版,使用ResNet50也能达到47.2AP
  3. 19999 元的小米 MIX Alpha,有哪些亮点和不足?
  4. Java树形结构筛选
  5. 为什么Flutter能最好地改变移动开发?建议收藏
  6. koa2 mysql_Koa2实现基本的登录注册
  7. 米老师讲 ITOO4.1 ——Java
  8. 乐视网:将于6月28日召开2018年度股东大会
  9. java学习心得(1)
  10. Excel 双斜线表头绘制