OpenCV的viz库学习(二)
学习目标
这次学习中将学会下面三部分:
- 如何使用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库学习(二)相关推荐
- OpenCV与AIPCV库——学习笔记(一)
本专题是学习Algorithms for Image Processing and Computer Vision的笔记. AIPCV是书名的缩写. 使用OpenCV时,需要了解的关键细节是数据结构的 ...
- Echarts开源可视化库学习(二)常用图表的实现与效果
一.柱状图 一.Echarts最基本的代码结构 <!DOCTYPE html> <html lang="en"><head><meta c ...
- OpenCV的viz库学习(一)
学习目标 这次学习中将学会下面三部分: 添加一些部件到可视化窗口 使用Affine3设置部件的姿势 部件沿轴旋转与平移 代码 #include <opencv2/viz.hpp> #inc ...
- TH库学习(二): THTensorApply宏观理解(简化)
特别说明,本文大多思路和解释都源于: [1] PyTorch源码浅析(一) [2] PyTorch源码浅析(二) [3] tiny_lib TensorApply系列的宏函数是TH实现各种张量元素操作 ...
- CMakeLists学习二、链接库搜索路径与ld
CMakeLists学习二.链接库搜索路径与ld 前言 gcc的链接 gcc链接命令 ld搜索路径 ldconfig刷新动态库缓存 CMakeLists指定链接搜索路径 后记 前言 本文继续CMake ...
- Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例
2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...
- OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()
OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...
- OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()
OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...
- OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()
OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1.connectedComponents() ...
最新文章
- 如何在JavaScript中实现链接列表
- 肏蛋的Loadrunner脚本
- 软工作业——四则运算生成器(scala 实现)
- 关于tcp、http可能你想知道的那些事
- CentOS下tftp 安装配置使用
- python【蓝桥杯vip练习题库】PREV-52小数第n位(模拟)
- 深度学习的seq2seq模型——本质是LSTM,训练过程是使得所有样本的p(y1,...,yT‘|x1,...,xT)概率之和最大...
- python函数后面两个括号_简单了解为什么python函数后有多个括号
- jQuery——子元素筛选器
- boost::pool
- 解决Vue-Router报错:vue-router.esm.js:17 [vue-router] <router-link>‘s tag prop is deprecated and has been
- path的图片下拉效果
- python在生活中有哪些用处-Python语言有哪些用途
- head first系列pdf下载
- 2021年计算机类考研人数,2021年考研79所院校报考人数汇总
- Linux使用详解(进阶篇)
- 心理学家:人生最可怕的不是失去爱,而是失去这种能力
- 张亚勤:微软九成研发资源投入云计算
- win7网站服务器空间怎么清理,window_Win7系统如何清理C盘空间?Win7系统清理C盘空间小技巧, Win7系统清理C盘空间小技 - phpStudy...
- Linux-Linux内核-进程调度