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