第十章g2o_custonbundle/common/projection.h

2023-10-10 15:33

本文主要是介绍第十章g2o_custonbundle/common/projection.h,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个类实现了整个投影过程,对应书上10.2.1里面一直到图10-2
还是挺简单的

#ifndef PROJECTION_H
#define PROJECTION_H#include "tools/rotation.h"/*** 这个头文件中只有一个内联函数:带畸变的相机投影* inline bool CamProjectionWithDistortion(const T* camera, const T* point, T* predictions){}* 整个这个函数就是P246页图10-2的代码实现。** @tparam T 很明显要用模板类,以包含float和double这些类型,主要是这两种,int的还没见过* @param camera 相机内外参,9维数组。0-2旋转向量、3-5平移向量、6-8相机内参(f,二阶径向畸变系数,四阶径向畸变系数)* @param point 投影空间点* @param predictions 投影得到的以图像中心为坐标原点下的像素坐标,取名为预测值,因为性质上这个坐标确是估计值。* 这里注意一下,这里不是一般意义上像素坐标,一般意义下的像素坐标是以图像左上角为原点。最后面有一些体现~* @return 整个投影过程成功的话,返回true。*/// camera : 9 dims array with 
// [0-2] : angle-axis rotation 
// [3-5] : translateion
// [6-8] : camera parameter, [6] focal length, [7-8] second and forth order radial distortion
// point : 3D location. 
// predictions : 2D predictions with center of the image plane. template<typename T>
inline bool CamProjectionWithDistortion(const T* camera, const T* point, T* predictions)
{// Rodrigues' formula//创建一个中间变量,这个p就是相机坐标系下的空间点的坐标。T p[3];//通过tool文件夹中的rotation.h中的AngleAxisRotatePoint()函数计算在相机仅旋转的情况下,新坐标系下的坐标。说白就是p=R*point。//这里有个小现象点开此函数定义发现,它的第一个参数需要的是个三元素数组,而这里的camera数组是9元素的,也是能用的。对应只取到前三维。//由数组名的本质可知为什么AngleAxisRotatePoint(camera, point, p);// camera[3,4,5] are the translation//旋转完之后,平移直接加上就好了。此时的p=R*point+t。即是相机坐标系下空间点的坐标了。也就是式10.36的p`p[0] += camera[3]; p[1] += camera[4]; p[2] += camera[5];//得到相机坐标系下空间点的坐标后,下面就是纯粹的相机本身的投影过程了,跟外部没有关系了。// Compute the center fo distortion//归一化坐标,也就是在求式10.37的Pc,这里的xp yp就是书上的uc vc。//问题:这个负号是什么鬼?T xp = -p[0]/p[2];T yp = -p[1]/p[2];// Apply second and fourth order radial distortion// 这四步将二四阶畸变系数取出来,构造成一个畸变distortion。也就是式10.38中()中的东西const T& l1 = camera[7];const T& l2 = camera[8];T r2 = xp*xp + yp*yp;T distortion = T(1.0) + l1 * r2  + l2 * r2*r2;//distortion*xp为式10.39中的Uc’和Vc‘,再乘上焦距f得到式10.39中的fx*Uc’和fx*Vc‘。//注意,到此为止了,并没有算得整个式10.39中的Us和Vs。//也就是predictions的坐标是以图像正中心为原点坐标系下的像素坐标。不是一般意义的以图像左上角为原点开始的坐标。//再回头看整个函数,camera参数压根没有传进来Cx和Cy,所以也就无从算起了。也好搞,根据图像大小直接就能算出来一般意义下的像素坐标//这里猜测一下为什么只到这里结束了,应该还是为了不同分辨率下图像程序通用性而考虑。const T& focal = camera[6];predictions[0] = focal * distortion * xp;predictions[1] = focal * distortion * yp;return true;
}#endif // projection.h

2017年10月3日12:45晟碟假期会议室

这篇关于第十章g2o_custonbundle/common/projection.h的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/181372

相关文章

第十章 【后端】环境准备(10.4)——Vagrant

10.4 Vagrant Vagrant 官网 Vagrant 镜像仓库 下载 安装 直接 install。 设置环境变量 Vagrant 默认将镜像保存在用户文件夹的 .vagrant.d 目录下,若用户文件夹在C盘,下载的镜像文件会大量占用C盘空间。设置环境变量 VAGRANT_HOME 后,Vagrant 会将镜像保存到环境变量指定的文件夹下。

Python计算机视觉编程 第十章

目录 一、OpenCv基础知识 1.读取和写入图像 2.颜色空间 3.显示图像和结果 二、处理视频 1.输入视频 2.将视频读取到NumPy数组中 三、跟踪 1.光流 2.Lucas-Kanade算法 一、OpenCv基础知识 OpenCV 自带读取、写入图像函数以及矩阵操作和数学库。 1.读取和写入图像 import cv2# 读取图像im = c

Matlab simulink建模与仿真 第十章(模型扩展功能库)

参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 一、模型扩展功能库中的模块概览         注:下面不会对Block Support Table模块进行介绍。 二、基于触发的和基于时间的线性化模块 1、Trigger-Based Linearization基于触发的线性化模块 (1)每次当模块受到触发时,都会调用linmod或者dlinmod函数

兔子--Android Studio出现错误:Error:Execution failed for task ':myapp:dexDebug'. com.android.ide.common.pro

重点在:finished with non-zero exit value 2. 这里表明了有重复的内容存在。 由于:Android Studio中引入包的方式有如下2种:    compile 'com.android.support:support-v4:22.0.0'    compile files('libs/support-v

YOLOV5入门教学-common.py文件

在 YOLOv5 框架中,common.py 文件是一个核心组件,负责定义深度学习模型的基础模块和常用操作。无论是卷积层、激活函数、特征融合还是其他复杂的模型结构,common.py 都提供了灵活且高效的实现。在这篇文章中,我们将深入解析 common.py 的设计思想、各个模块的功能以及它在 YOLOv5 中的应用。通过理解该文件的实现细节,不仅可以帮助我们更好地掌握 YOLOv5 的内部结构,

网络协议栈学习之socket, sock_common, sock, 和 sk_buff

一. 前言   一直很好奇socket是如何实现的,底层的数据结构又是如何,因此在这里对socket的数据结构进行分析。   socket是传输层使用的数据结构,用于声明、定义套接字,网络层会调用sock结构体,其中sock会用到了通用sock_common结构体。而sk_buff则是内核中使用的套接字缓冲区结构体。在我们前文提到的NAT转换中,除了修改内核已有的Netfilter源码外,还有一

Netfilter学习之NAT类型动态配置(八)nf_nat_proto_common.c代码解析

nf_nat_proto_common.c实现了对称型的端口改变,在此我决定对其代码进行分析,以便实现对对称型NAT的随意改动。    具体代码如下: #include <linux/types.h>#include <linux/random.h>#include <linux/netfilter.h>#include <linux/export.h>#include <net/n

Binary Tree - Lowest Common Ancestor 题型总结

Lowest Common Ancestor of a Binary Search Tree 思路:这题跟 Lowest Common Ancestor of Binary Tree 一模一样。思路:就是找p的节点在不在左支,或者右支,找到各自左右节点,然后进行比较,如果两者不一样,说明当前的root就是lowest 父节点,如果左边为空,那就都在右边,返回右边的即可,如果右边为空,那就都在左

leetcode --- Longest Common Prefix

最长公共前缀(Longest  Common  Prefix) 题目:Write a function to find the longest common prefix string amongst an array of strings. 题目链接:https://leetcode.com/problems/longest-common-pref

第十章 DCEP简介

第十章 DCEP简介 1、概述2、概念3、目标3.1 国内需求3.1.1 纸质现金的不足3.1.2 数字资产的需求3.1.2 反洗钱、反恐怖融资的需要3.1.3 负利率有望实现3.1.4 信息安全的需求 3.2 国际机遇3.3 核心目标 4、特点5、优缺点5.1 优点5.2 缺点 6、对比6.1 DCEP与比特币、以太坊等加密货币6.2 DCEP与Libra6.3 DCEP与支付宝、微信 参