-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlocal-search.xml
33 lines (15 loc) · 21.3 KB
/
local-search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>摄像几何及相机内外参数</title>
<link href="/87799132.html"/>
<url>/87799132.html</url>
<content type="html"><![CDATA[<h2 align="center"> 摄像几何(坐标系的转换及相机内外参)</h2><p>最近在使用 open3d 从 depth map 转点云时接触到了相机内外参的相关内容,但是查阅许久之后感觉查到的对于相机内外参的转换都说的不够明朗,于是决定自己写一篇摄像几何的相关内容来记录一下,这篇博客将包含某个点从世界坐标系,到摄像机坐标系,再到成像平面坐标系,最后到像素坐标系的转换,同时也包含了相机内外参的相关内容~<span class="github-emoji"><span>😄</span><img src="https://github.githubassets.com/images/icons/emoji/unicode/1f604.png?v8" aria-hidden="true" onerror="this.parent.classList.add('github-emoji-fallback')"></span></p><h4 id="1-坐标系定义"><a href="#1-坐标系定义" class="headerlink" title="1. 坐标系定义"></a>1. 坐标系定义</h4><ul><li>世界坐标系:描述相机和待测物体空间位置的三维直角坐标系。</li><li>摄像机坐标系:该坐标系原点为相机的光圈, $Z$ 轴为相机的光轴,其 $X$ 轴和 $Y$ 轴通常平行于成像坐标系的X轴和Y轴</li><li>成像坐标系:成像平面则是指物体通过摄像机成像后,该图像所在的平面,该平面以米为单位。该平面原点通常在摄像机坐标系的 $Z$ 轴上,且和相机光圈的距离是焦距 $f$ ,其 $X$ 和 $Y$ 轴平行于摄像机坐标的 $X$ 和 $Y$ 轴</li><li>像素坐标系:该平面以像素为单位,说白了就是一个单独的坐标系,该坐标系可以从成像坐标系将单位转换为像素后获得,至于为什么要转换呢?我们在计算机上看到的图片是以像素为单位的,而成像平面是以米为单位的,转换后当然是方便做计算。</li></ul><p><img src="https://s2.loli.net/2023/04/11/nQVIr4SZkLXpmib.png" width="700"></p><h4 id="2-摄像机坐标系-到-成像平面坐标系的转换"><a href="#2-摄像机坐标系-到-成像平面坐标系的转换" class="headerlink" title="2. 摄像机坐标系 到 成像平面坐标系的转换"></a>2. 摄像机坐标系 到 成像平面坐标系的转换</h4><p>如上图所示,在摄像机坐标系下,我们将 $P(x,y,z)$ 经过成像原理投影到了成像平面上的 $P’(x’,y’)$ ,假设我们已知 $P$ 点坐标,我们现在想将 $P’$ 的坐标用 $x$ 和 $y$ 表示出来。 </p><p>我们从摄像机坐标系 $i$ 轴方向看,可以看到 $P$ 和 $P’$ 的位置如下图所示:</p><p><img src="https://s2.loli.net/2023/04/11/m72ub4XLiC5ZdqI.png" width="700"></p><p>其中 $f$ 即为相机焦距,$f$ 与相机有关,属于已知条件,根据相似三角形原理,可以得出以下关系:$y’=f\frac{y}{z}$ , 同理,从 $j$ 轴方向看,可得:$x’=f\frac{x}{z}$ </p><p>那么 $P$ 到 $P’$ (这里的 $P’$ 表示成像平面坐标空间)的映射如下</p><script type="math/tex; mode=display">P=\left[\begin{matrix} x \\ y \\ z\end{matrix}\right]\toP'=\left[\begin{matrix} x' \\ y'\end{matrix}\right]=\left[\begin{matrix} f\frac{x}{z} \\ f\frac{y}{z}\end{matrix}\right]</script><h4 id="3-成像平面坐标系-到-像素坐标系的转换"><a href="#3-成像平面坐标系-到-像素坐标系的转换" class="headerlink" title="3.成像平面坐标系 到 像素坐标系的转换"></a>3.成像平面坐标系 到 像素坐标系的转换</h4><h5 id="3-1-偏置"><a href="#3-1-偏置" class="headerlink" title="3.1 偏置"></a>3.1 偏置</h5><p>现在,我们已经将摄像机坐标系下的三维空间点映射到了二维成像平面上,但二维成像平面的单位是米,我们用于计算时并不方便,因此我们需要将二维成像平面坐标系上的点,再次映射到以像素为单位的像素平面坐标系上。 </p><p><img src="https://s2.loli.net/2023/04/11/EN5nkJ3YMWR1Pyp.png"></p><p>如上图所示,像素平面坐标系 $XY$ 的原点位于左下角,假设成像平面坐标系 $X^cY^c$ 的原点在像素平面坐标系上的坐标为 $(C_x,C_y)$ ,那么位于成像平面坐标系上的点 $(f\frac{x}{z},f\frac{y}{z})$ 映射到像素平面坐标系上时,其坐标为 $(f\frac{x}{z}+C_x,f\frac{y}{z}+C_y)$ ,这样就完成了吗?当然不是。 </p><h5 id="3-2-单位转换"><a href="#3-2-单位转换" class="headerlink" title="3.2 单位转换"></a>3.2 单位转换</h5><p>我们知道,不论是$f$,$x$ ,$y$ 还是 $z$ ,他们的单位都是米,而这里的$C_x$ 和 $C_y$ 的单位都是像素,肯定是不能直接使用加法操作将两者加到一起的,所以在加法操作之前,需要有一个单位转换的操作。</p><p>这里我们引入参数 $k$ 和 $l$ ,他们的单位是 $pixel/m$ ,他们代表的含义分别是在成像平面坐标系的 $x$ 和 $y$ 轴上,一米对应多少个像素宽度,这两个参数大小与相机的成像元器件有关,显然,值越大,越清晰,那么我们将 $k$ 和 $l$ 加入公式中,将 $f\frac{z}{z}$ 和 $f\frac{y}{z}$ 分别乘上 $k$ 和 $l$ ,就把单位从米转换到像素了。到目前为止,三维空间坐标转换到二维像素坐标表达如下:</p><script type="math/tex; mode=display">(x,y,z) \to (f\frac{x}{z},f\frac{y}{z}) \to(fk\frac{x}{z}+C_x,fl\frac{y}{z}+C_y)</script><p>注意,这里的$k$ 和 $l$ 可能相同也可能不相同</p><p>由于 $f$ , $k$ , $l$ 三者均为常数,因此 $fk$ 和 $fl$ 也是常数,我们可以简化一下,令 $\alpha = fk$ ,$\beta=fl$ ,易知$\alpha$,$\beta$ 单位为 $pixel$ ,因此,三维空间坐标到二位像素平面坐标转换表达如下</p><script type="math/tex; mode=display">(x,y,z) \to (f\frac{x}{z},f\frac{y}{z}) \to(fk\frac{x}{z}+C_x,fl\frac{y}{z}+C_y) \to(\alpha\frac{x}{z}+C_x,\beta\frac{y}{z}+C_y)</script><p>观察上述表达式可知,从$P(x,y,z)\to P’(x’,y’)$ ,(注意,这里的$P’$ 以及之后出现的$P’$ 均表示为像素坐标)即,从 $(x,y,z)$ 到 $(\alpha\frac{x}{z}+C_x,\beta\frac{y}{z}+C_y)$ ,对于 $x’=\alpha\frac{x}{z}+C_x$,$y’=\beta\frac{y}{z}+C_y$,这两个表达式是非线性的,因为我们改变 $x$ 和 $y$ 的同时,$z$ 也有可能会变化,但如果我们想将这个变化过程优化成线性的该怎么做呢?(转变为线性表达式可以简化后续任务)这里需要引入齐次坐标来解决问题。</p><h4 id="4-齐次坐标"><a href="#4-齐次坐标" class="headerlink" title="4.齐次坐标"></a>4.齐次坐标</h4><h5 id="4-1-欧氏空间坐标到齐次空间坐标-E-to-H"><a href="#4-1-欧氏空间坐标到齐次空间坐标-E-to-H" class="headerlink" title="4.1 欧氏空间坐标到齐次空间坐标 $E \to H$"></a>4.1 欧氏空间坐标到齐次空间坐标 $E \to H$</h5><script type="math/tex; mode=display">二维图像点的齐次坐标:(x,y)\to\left[\begin{matrix} x \\ y \\ 1\end{matrix}\right]</script><script type="math/tex; mode=display">三维空间点的齐次坐标:(x,y,z)\to\left[\begin{matrix} x\\ y\\ z\\ 1\end{matrix}\right]</script><h5 id="4-2-齐次坐标空间坐标到欧氏空间坐标-H-to-E"><a href="#4-2-齐次坐标空间坐标到欧氏空间坐标-H-to-E" class="headerlink" title="4.2 齐次坐标空间坐标到欧氏空间坐标 $H\to E$"></a>4.2 齐次坐标空间坐标到欧氏空间坐标 $H\to E$</h5><script type="math/tex; mode=display">\left[\begin{matrix} x\\ y\\ w\end{matrix}\right]\to(x/w,y/w)</script><script type="math/tex; mode=display">\left[\begin{matrix} x\\ y\\ z\\ w\end{matrix}\right]\to(x/w,y/w,z/w)</script><p>值得注意的是,对于同一个欧式坐标,可以有不同的齐次坐标,即两个空间的变换并不是一一对应,比如$\left[\begin{smallmatrix}1\\ 1\\ 1\end{smallmatrix}\right]$ 和 $\left[\begin{smallmatrix}2\\ 2\\ 2\end{smallmatrix}\right]$他们对应的欧式坐标,也就是二维空间坐标都是$(1,1,1)$,他们只是在齐次坐标上相差一个系数而已</p><h4 id="5-将坐标转换优化为线性变换"><a href="#5-将坐标转换优化为线性变换" class="headerlink" title="5.将坐标转换优化为线性变换"></a>5.将坐标转换优化为线性变换</h4><p>有了上述齐次坐标转换的基础后,我们可以将二维像素坐标下的点 $(\alpha\frac{x}{z}+C_x,\beta\frac{y}{z}+C_y)$ 表达为齐次坐标 $\left[\begin{smallmatrix}\alpha x+C_xz \\ \beta y+C_yz \\ z\end{smallmatrix}\right]$,而我们可以发现该齐次坐标矩阵有着如下关系:</p><script type="math/tex; mode=display">P_h'=\left[\begin{matrix} \alpha x+C_xz\\ \beta y+C_yz\\ z\end{matrix}\right]=\left[\begin{matrix} \alpha & 0 & C_x & 0\\ 0 & \beta & C_y & 0\\ 0 & 0 & 1 & 0\end{matrix}\right]\left[\begin{matrix} x\\ y\\ z\\ 1\end{matrix}\right]=MP_h</script><p>其中$P_h’$ 表示像素平面坐标对应的齐次空间下的坐标,而矩阵$ \left[\begin{smallmatrix}x \\ y \\ z \\ 1\end{smallmatrix}\right] $ 又是我们三维空间坐标$(x,y,z)$ 对应的齐次坐标$P_h$,矩阵$\left[\begin{smallmatrix}\alpha & 0 & C_x & 0 \\ 0 & \beta & C_y & 0 \\ 0 & 0 & 1 & 0\end{smallmatrix}\right]$ (记为$M$)是固定不变的,因此在欧式空间下三维到二维的非线性变换 $(x,y,z)$ $\to$ $(x’,y’)=(\alpha\frac{x}{z}+C_x,\beta\frac{y}{z}+C_y)$ ,在齐次空间下,欧氏空间中的三维空间点到二维空间点有了线性变换$P_h’=MP_h$</p><h4 id="6-摄像机内参矩阵"><a href="#6-摄像机内参矩阵" class="headerlink" title="6.摄像机内参矩阵"></a>6.摄像机内参矩阵</h4><p>而出于制造工艺的误差,有时候在欧氏空间下,我们的成像平面到像素平面的转换过程中,我们像素平面的像素不一定是直角方形的,可能是平行四边形的,假设两条边之间的夹角为 $\theta$ ,如下图所示 </p><p><img src="https://s2.loli.net/2023/04/11/TtA1HlW94bSp6NF.png"></p><p>那么我们在齐次空间下坐标的变换修改成如下格式</p><script type="math/tex; mode=display">P_h'=\left[\begin{matrix} \alpha & -\alpha cot\theta & C_x & 0 \\ 0 & \beta /sin\theta & C_x & 0 \\ 0 & 0 & 1 & 0\end{matrix}\right]\left[\begin{matrix} x \\ y \\ z \\ 1\end{matrix}\right]=MP_h=K\left[\begin{matrix} I & 0\end{matrix}\right]P_h</script><p>在上面的这个表达式中,我们记$M=\left[\begin{smallmatrix}\alpha & -\alpha cot\theta & C_x & 0 \\ 0 & \beta /sin\theta & C_x & 0 \\ 0 & 0 & 1 & 0\end{smallmatrix}\right]$ 为投影矩阵,记 $K=\left[\begin{smallmatrix}\alpha & -\alpha cot\theta & C_x \\ 0 & \beta /sin\theta & C_x \\ 0 & 0& 1\end{smallmatrix}\right]$ 为摄像机内参矩阵,显然,摄像机内参矩阵决定了摄像机坐标系下空间点到图像点的映射,当我们的 $\theta$ 为 $90^\circ$ 时,$M$ 就是我们之前的矩阵 $\left[\begin{smallmatrix}\alpha & 0 & C_x & 0 \\ 0 & \beta & C_y & 0 \\ 0 & 0 & 1 & 0\end{smallmatrix}\right]$ </p><h4 id="7-世界坐标系到摄像机坐标系的变换以及摄像机外参矩阵"><a href="#7-世界坐标系到摄像机坐标系的变换以及摄像机外参矩阵" class="headerlink" title="7.世界坐标系到摄像机坐标系的变换以及摄像机外参矩阵"></a>7.世界坐标系到摄像机坐标系的变换以及摄像机外参矩阵</h4><p>到目前位置,我们已经知道了如何将一个摄像机坐标系下的三维空间点,通过齐次空间,转换为像素坐标系下的二维空间点,且该变换是线性的。而在实践中,我们往往拥有多个摄像机,那么同一个物体在多个摄像机坐标系下的位置是不相同的,因此我们需要将其统一,那么这里就需要运用到世界坐标系了,世界坐标系的原点我们可以根据情况自己定义。</p><p>在将世界坐标系下的点转换到摄像机坐标系下时,只需要通过平移和旋转来操作,而平移和旋转又能够通过齐次空间中的矩阵表示,这里不再赘述,因此,在齐次空间中,有如下关系:</p><script type="math/tex; mode=display">P_h=\left[\begin{matrix} R & T \\ 0 & 1\end{matrix}\right]\left[\begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix}\right]=\left[\begin{matrix} R_{3\times3} & T_{3\times1} \\ 0_{1\times3} & 1_{1\times1}\end{matrix}\right]P_w</script><p>其中 $R$ 和 $T$ 分别代表旋转矩阵和平移矩阵,世界坐标系下的点通过旋转和平移就能够得到摄像机坐标系下的点。 </p><h4 id="8-完整的摄像机模型"><a href="#8-完整的摄像机模型" class="headerlink" title="8.完整的摄像机模型"></a>8.完整的摄像机模型</h4><p>我们已经知道 $P_h$ 和 $P_h’$ 的关系,那么最终,<strong>完整的摄像机模型</strong>,在齐次空间下,世界坐标系下的点转换到像素平面下的点的关系如下:</p><script type="math/tex; mode=display">P_h' = K\left[\begin{matrix} I & 0\end{matrix}\right]P_h=K\left[\begin{matrix} I & 0\end{matrix}\right]\left[\begin{matrix} R & T \\ 0 & 1\end{matrix}\right]P_w=K\left[\begin{matrix} R & T\end{matrix}\right]P_w=MP_w</script><p>其中,我们称 $\left[\begin{smallmatrix}R & T\end{smallmatrix}\right]$ 为摄像机的外参矩阵,$K$ 为摄像机内参矩阵,$M$ 称为投影矩阵,再附上一张总结图如下</p><p><img src="https://s2.loli.net/2023/04/11/rT2QvMNnxP5gh4D.png" width="700"></p><p>那么以上一连串的表达均是在齐次坐标系下完成,那么我们如何将 $P_h’$ 在欧式空间中表达呢? 我们只需要将最终的齐次矩阵 $MP_w$ 表达为欧氏空间下的矩阵即可,表达如下:</p><script type="math/tex; mode=display">P_h' = MP_w = \left[\begin{matrix} m_1 \\ m_2 \\ m_3\end{matrix}\right]P_w=\left[\begin{matrix} m_1P_w \\ m_2P_w \\ m_3P_w\end{matrix}\right]\to(\frac{m_1P_w}{m_3P_w},\frac{m_2P_w}{m_3P_w})</script><p>最右侧的坐标即为像素空间下的二维坐标</p>]]></content>
</entry>
<entry>
<title>如何使用Hexo + GithubPages搭建个人博客</title>
<link href="/d87f7e0c.html"/>
<url>/d87f7e0c.html</url>
<content type="html"><![CDATA[<h2 align="center"> Hexo + GithubPages搭建个人博客</h2><h3 id="1-准备工作"><a href="#1-准备工作" class="headerlink" title="1. 准备工作"></a>1. 准备工作</h3><h4 id="1-1-Node-js"><a href="#1-1-Node-js" class="headerlink" title="1.1 Node.js"></a>1.1 Node.js</h4><ul><li>Node.js 是一套JavaScript的运行环境,它使得JavaScript不再依赖于浏览器,可以像其他编程语言一样直接在计算机上使用</li><li>Node.js 可帮助我们搭建博客,实现博客的结构化管理,例如,在下列步骤安装hexo时需要使用到Node.js的包管理工具npm</li><li>Node.js 安装步骤网上有很多资源,在此不再赘述,这里提供官网链接:<a href="https://nodejs.org/en">Node.js</a></li></ul><h4 id="1-2-Git"><a href="#1-2-Git" class="headerlink" title="1.2 Git"></a>1.2 Git</h4><ul><li>git 是一款强大的版本控制系统,也帮助了我们来对个人博客的各种文件进行备份,git官网:<a href="https://git-scm.com/">git</a> </li><li>可以使用git —version查看git是否安装成功</li></ul><h4 id="1-3-注册-github-账号"><a href="#1-3-注册-github-账号" class="headerlink" title="1.3 注册 github 账号"></a>1.3 注册 github 账号</h4><ul><li>注册一个github账号,帮助我们的个人博客不仅仅局限于本地</li></ul><h3 id="2-搭建博客"><a href="#2-搭建博客" class="headerlink" title="2. 搭建博客"></a>2. 搭建博客</h3><h4 id="2-1-Hexo-安装及本地生成博客"><a href="#2-1-Hexo-安装及本地生成博客" class="headerlink" title="2.1 Hexo 安装及本地生成博客"></a>2.1 Hexo 安装及本地生成博客</h4><ul><li>Hexo 是一个快速、简介、高效的博客框架( 官网这么写的 :) ),可用于生成静态网页,安装Hexo之前,请务必已经安装好Node.js 及 Git</li><li>使用npm对Hexo进行安装(npm已经随同Node.js下载好)</li></ul><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># -g 表示全局安装,不会在项目node_modules目录中保存模块包</span><br>npm install -g hexo-cli<br></code></pre></td></tr></tbody></table></figure><ul><li>安装好Hexo后,新建一个存放博客的文件夹,并进入该文件夹进行如下操作</li></ul><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment">#在新建的博客文件夹下使用Hexo初始化目录</span><br>hexo init<br><span class="hljs-comment">#开启本地服务</span><br>hexo s<br></code></pre></td></tr></tbody></table></figure><p> 可以看到初始化后的博客目录如下,开启本地服务后,也可打开网址 <a href="http://localhost:4000/">http://localhost:4000/</a> 查看生成的本地网页</p><p><img src="https://s2.loli.net/2023/04/11/WIjV1fOSYz9eFX8.png" alt="初始化的博客目录"></p><ul><li><ul><li>其中,_config.yml 是配置文件,可在此配置相关参数</li><li>package.json 是应用程序和相关包的信息</li><li>scaffolds 是模板文件夹,新建文章,网页时,将按照此文件夹下的相关文件进行生成</li><li>source 是资源文件夹,我们写的博客文章,网页等信息都将包含在这个文件夹下</li><li>themes是主题文件夹,可在此保存主题</li></ul></li></ul><h4 id="2-2-博客部署"><a href="#2-2-博客部署" class="headerlink" title="2.2 博客部署"></a>2.2 博客部署</h4><ul><li>首先需要安装 hexo-deployer-git 插件,这样才能依赖于git将我们的博客部署到Github repository中</li></ul><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># --save 表示将模块安装到node_modules下,并且在package文件的dependencies节点中写入</span><br>npm install hexo-deployer-git --save<br></code></pre></td></tr></tbody></table></figure><ul><li>安装完上述模块后,接下来就到了发挥github的作用了,去github新建一个repository,repository name必须采用如下格式 { your github name }.github.io,如果不采用这个格式,就没法在网址上找到自己的个人博客了,且将该repository的权限设置为public</li><li>创建完repository后,复制好该repository的https(好像SSH也可以),如下图所示:</li></ul><p><img src="https://s2.loli.net/2023/04/11/W8rXYDFEe5ivBO7.png" alt=""></p><ul><li>打开站点的配置文件(即_config.yml),找到deploy节点,进行如下修改:</li></ul><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash">deploy:<br><span class="hljs-built_in">type</span>: git<br><span class="hljs-comment">#本地文件上传至该repository中</span><br>repo: 将你自己的repository的 https 或 SSH 粘贴在这<br><span class="hljs-comment">#之后的部署会将public中的资源保存在repository的master分支中</span><br>branch:master <br></code></pre></td></tr></tbody></table></figure><ul><li>打开git bash,将当前目录修改为个人博客的目录,并设置git的用户名和邮箱,建议与github的用户名和邮箱保持一致 </li></ul><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">git config --global user.name 你的用户名<br>git config --global user.email 你的邮箱<br></code></pre></td></tr></tbody></table></figure><ul><li><p>可以创建SSH key,这样可以在本地文件上传到github中时,不必再每次输入github的密码,网上有很多帖子说这个,我就不在此赘述了</p></li><li><p>运行如下命令</p></li></ul><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment">#清除本地缓存,即删除public文件夹,这个文件夹是基于本地的文件生成的、用于上传到仓库或者其他网站服务器#上的文件夹</span><br>hexo clean<br><span class="hljs-comment">#再次生成public文件夹</span><br>hexo g<br><span class="hljs-comment">#部署到github上</span><br>hexo d<br></code></pre></td></tr></tbody></table></figure><p> 就可以使用{your github username}.github.io来访问自己的博客了!</p>]]></content>
</entry>
</search>