-
2021-03-06 11:03:11
思路
首先将最小的数与a[0]对换;再将a[1]~a[n]中最小的数与a[1]对换……每比较一轮,找出一个最小的,共比较n-1轮。
代码
#include<stdio.h> int main() { void sort(int array[], int n); int a[10]; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } sort(a, 10); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; } void sort(int array[], int n) { int k, t; for (int i = 0; i < n - 1; i++) { k = i; for (int j = i + 1; j < n; j++) { if (array[j] < array[k]) k = j; } t = array[k]; array[k] = array[i]; array[i] = t; } }
更多相关内容 -
Python 实现将数组值按从小到大的顺序排列
2020-11-30 00:23:55一、个人理解可分为 5 步来实现:1、函数 selectionSort 获取数组值后赋值到数组 arr 并传递到函数 findSmallest 查找当前 arr 的最小值。2、函数 findSmallest 获取 arr 的值后,将 arr 的第一个值和索引存储到变量...一、个人理解可分为 5 步来实现:
1、函数 selectionSort 获取数组值后赋值到数组 arr 并传递到函数 findSmallest 查找当前 arr 的最小值。
2、函数 findSmallest 获取 arr 的值后,将 arr 的第一个值和索引存储到变量 samllest 和 smallest_index 上。
3、通过循环(循环次数为 arr 值总数)对比 arr[i] 的值和变量 smallest,如果 arr[i] 小于 smallest,那么将当前的 arr[i] 值取代原来的 smallest 值,完成整个循环对比后,返回最终最小值的索引值到函数 selectionSort。
4、函数 selectionSort 获取到数组索引后,通过 arr.pop(smallest_index) 移取出目标数值并通过 append 添加到新数组 newArr 中完成数值转移。
5、这时,再将被移除最小值的 arr 传值到 findSmallest 查找 arr 下一个最小值,完成所有循环后,就能得到一个从小到大的顺序排序排列的数组
二、代码实现
# 对数组进行排序
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
smallest_index = findSmallest(arr)
newArr.append(arr.pop(smallest_index)) # 将 arr 中最小值移到 newArr 中.
return newArr
# 找出数组中最小元素
def findSmallest(arr):
smallest = arr[0] # 存储最小的值
smallest_index = 0 # 存储最小值的索引
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
result = selectionSort([5, 3, 0])
print(result) # [0, 3, 5]
三、数据测试
1、假设我们要排序数组 [5, 3, 0],那么这时 arr = [5, 3, 0]
2、通过函数 findSmallest(arr) 对比查找最小值得到是 0 ,而 0 的索引是 2,即会返回 2 并赋值到函数 selectionSort 的变量 smallest_index 中。
3、通过 arr.pop(2) 移除 arr 中对应的数据(0),又通过 append 赋值 0 到新数组 newArr 中。
4、这时 arr = [5, 3],newArr = [0]。因为 selectionSort 的循环还没有结束,所以要进行下一次循环,把改变后的 arr([5, 3])传到函数 findSmallest(arr) 进行新的一轮对比返回当下数组([5, 3])最小值的索引。
5、以此循环类推,最后得到一个从小到大的顺序排序排列的数组([0, 3, 5])
-
噪声情况下模型式无波前探测自适应光学系统扩展目标成像校正
2021-02-22 07:40:38利用88单元变形镜及电荷耦合...按照湍流条件从小到大的顺序, 与信噪比为20 dB的结果相比, 信噪比为5 dB时校正后的平均均方根相对误差分别为3.71%,2.94%和2.42%, 说明基于该线性关系的模型控制算法具有较强的抗噪能力。 -
目标跟踪-参考论文.zip
2020-04-23 18:44:16这是目标跟踪的参考论文(共14篇),自己从小白开始的学习之路,整理了一下,建议先看综述类,接着按时间开始从前往后看。 -
为什么要从小树立远大的目标?
2020-02-16 15:41:36那么,为什么要从小树立远大的理想和目标呢?这一点是老师没有讲清楚的。 为什么要树立远大的理想和目标 这里有一个问题,多大的目标才是远大的目标呢?或者我们树立一个小的目标可以吗? 假设图中小人的目标是绿色...早在小学时候,老师就会告诉我们,要树立远大的理想和目标。那么,为什么要从小树立远大的理想和目标呢?这一点是老师没有讲清楚的。
为什么要树立远大的理想和目标
这里有一个问题,多大的目标才是远大的目标呢?或者我们树立一个小的目标可以吗?
假设图中小人的目标是绿色的三角形,这个目标看起来很普通,在很多其他的会路过的目标中,显得不是很突出。
于是小人开始朝着这个目标前进,最开始他是可以看到这个目标,因此知道它前进的方向,可是当走了一段距离,这个目标就再也看不见了,他被形形色色的其他的目标,其他的困难所挡住了。现实中,要实现那个小目标,甚至还要翻过一个高的多的大山,或者度过难的多的一条河流。于是出现两种情况,一个是走着走着去到了另外的方向,离最开始的目标越来越远了。另外一种情况,就是会产生一种,我付出了这么多,才实现一个小目标,是多么不值的心理反应,一旦这么想了,那结果自然就是,放弃这个目标。
但是有太多的故事,却长得都是这样。就像猪八戒经常要说的那样:“咱们分家吧,我回我的高老庄。。。”
为什么要提倡从小开始呢
“从小”这个词也很值得思考,我想小学的老师也并没有真正的理解,我猜当老师的也许就这么想:给学生鼓励鼓励,让他们好好学习就可以了,我的工作是教好小学的内容。
所以,绝大多数的学生,在小时候听完那些伟人的故事以后,也许会激动几天,然后,也就没有什么然后了,对于大部分人,说起理想和目标,完全不如“听妈妈的话”,这更有效。
当然这也跟小孩子的天性有关系,他们在认识很小的时候,得到一个超级伟大的理想,但其实是一个空中楼阁。然而小孩子的一切都在迅速的发展和变化,很快就会得到新的思想,过分的去盯着一个空中楼阁,反而是件奇怪的事情。
可见从小就树立远大的理想和目标,实际上是一个反人性的事情,如果这里的远大的目标,需要人的大半生的努力的话。
好的目标应该是怎样的?
上面第1段,是说如果我们有一个目标的话,还真不能太小。上面第2段,是说,倒也没有必要“从小”就树立“远大”的目标。那好的目标应该是怎样的呢?
回头看一下,《创业方程式》这篇文章:
目标可以表示为一个函数:G(t, v, e, m, r, o, b),其中,时间(t),视野(v),时代(E),我(M),资源(R),机会(O),商业模式(B)。我还是以小学生的例子说一下好的目标。小学生还在快速发展的状态中,也就是说目标应该随着时间快速变化,如果我们要确定一个目标,那不一就要做好他要很快变化的打算。
小学生的视野,通常也就在所在的班级,所学的那几门科目。把他的目标,定义在他的视野的边缘处,例如要考到班上的前10名,这样,他能感触到这个目标是实实在在的目标。当然,如果他的视野已经是年级,就把目标提高到年级标准。
几十年前的小学生,消除文盲是他们的目标,但是现在的小学生,已经开始接触人工智能的概念,所以我们能看见目标要随着时代的变化而变化。
下面说“我”,也就是小学生自己。确实有些小学生在某些方面展现出了惊人的特长,也或者说有些令父母不安的迟缓。我们在制定目标时,不得不考虑这些方面。
还有三个方面的变量,对小学生制定目标并不是太明显,资源(R),机会(O),商业模式(B)这里就不唠叨了。
最后
对于创业,任何时候都要有目标,而且可能不只是一套目标,一般要有短期目标和长期目标。对于创业企业,好的目标也像小学生的目标一样,需要考虑很多的因素,简单的说:“从小就要树立远大的目标”,就让他成为一句口号吧,仅仅是口号。
-
第二更,相机参数标定基础:从小孔成像开始到单双目标定
2020-03-10 20:03:49并且先看第一篇,即,阅读顺序为: 先读《相机参数标定(camera calibration)及标定结果如何使用》 再读《第二更,相机参数标定基础:从小孔成像开始到单双目标定》 内容量有点大,但是里面需要思考的逻辑内容,博...目录
本文是前一篇博客《相机参数标定(camera calibration)及标定结果如何使用》的第二更。
关于实践部分,请关注后续博客
所有这些东西,重在理解,关键是实际应用。对于工程而言,也没有必要把公式死记硬背,搞得滚瓜烂熟。
为什么要二次更新?
有很多同学通过留言,或者私下沟通反映了很多问题。而且对于单目标定和双目标定的理论基础没有分开讲清楚。所以博主强烈建议您先把第一篇博客看完,尤其是坐标系那一节。
为什么不在原来的基础上更新?
前一篇博客的整体架构已经确定了,没有打乱从来的必要,更像是一个知识点的普及。同时,这一更会把上一篇的有些内容也再次概括进来,在此基础上增加单目,双目,透视变换,单应性的一些知识。这样,基本上就把标定的理论基础说明白了。
本文尽量少用公式,免得看起来乱糟糟的,不明所以。尽量告诉大家,这些公式是怎么来的,帮助您理解标定的一般性原理。我再次强烈建议您把两篇博客结合起来看,并且先看第一篇,即,阅读顺序为:
先读《相机参数标定(camera calibration)及标定结果如何使用》
再读《第二更,相机参数标定基础:从小孔成像开始到单双目标定》
内容量有点大,但是里面需要思考的逻辑内容,博主都给你写出来了。您不需要动太多脑筋,博主的目的也就达到了。尽量不搞一些难懂的数学推导,阻挡继续读下去的信心。
本文已同步至公众号。如果您觉得本文对您帮助很大,可以扫描赞赏码支持作者,关注公众号,推荐给其他人。您的支持,是博主持续创作的动力。博主已经将本文所有内容的文档版本分享到了公众号,供下载,欢迎关注下载。
相机标定离不开特征点检测,关于特征点检测方法,可以查看我的另外几篇博客
另外,笔者也在公众号中分享了很多干货,关注公众号即可获取。先睹为快。
老鼠集,请回复:1
无参考图像质量评价,请回复:2
局部拉普拉斯滤波,请回复:3
可编辑的《Harris特征提取》PPT,请回复:4
完整可编辑的《透视变换》PPT,请回复:5
SIFT完整可编辑PPT及代码,请回复: 6
20款HDR图像生成工具下载地址,请回复:7
HDR视频色调映射算法综述翻译,请回复:8
HDR视频色调映射算法文章下载,请回复:9
LogMap色调映射代码,请回复:a
安卓端人工智能应用tensorflow lite 安装包下载,请回复:b
用CNN实现单幅图像生成HDR图像代码及论文,请回复:c单目相机和双目相机标定通用代码和使用说明(机器人用的ROS):请回复:d
本文是原创内容,未经允许不接受任何形式的转载抄袭!
话不多说,进入正题。
第一章 相机模型
相机模型可以用小孔成像模型来近似代替,可以用如下的图来表示。千万不要对这个图有误解,为什么焦距是像平面到小孔的距离,下面会说明。
问: 孔是不是越小越好呢?
当然不是。我们借用其他以发表文章的中描述来看。
可以明显的看到,孔越大,成的像成发散。孔越小,就会出现衍射现象。
问:为什么小孔到像平面的距离是焦距,为什么要搞一个虚拟像平面?
第一篇博客中已经说过,像平面就是成像的位置,这个是用户自己设定的,就是CCD传感器的位置,而焦平面就是镜头的焦距所在平面。当像平面刚好和焦平面重合时,此时所成的像是最清晰的。也就是我们经常说的“刚好对焦上了”。我们用一个图来说明。
实际上,由于物理条件的限制,像平面和焦平面是不可能完全重合的。如果改变了镜头的形状和尺寸,那么焦平面的位置也会发生变化。对焦的时候就需要重新调整CCD的位置,使其与焦平面重合。这解释了为什么是焦距。
我们还是用上面的小孔成像简化图来说明。因为真正的像平面所成的像是倒立的,而我们实际中,更习惯于正立的看待问题,所以就用虚拟的像平面代替真正的像平面。如果不做特殊说明,我们在下面的描述中,就用像平面代替虚拟像平面。相应的,成像简化图就变为如下所示。
我们把虚拟像平面的线条变成实线。这个图是不是似曾相识,就跟我们在第一篇博客中看到的坐标点图是一样的。不急,我们在下面慢慢说。请记住这个图。
问题又来了,三维中的点是如何投影到像平面?如果我知道三维中的一个点,能计算到它投影到像平面的哪个像素吗?
为了解决这个问题,我们就必须定义坐标系。一个坐标系是不够的,需要多个坐标系同时使用。
第二章 各个坐标系的定义和相互关系
在前一篇博客中,我们实际上已经对各个坐标系的定义做了详细的说明。但是,结合本文所画的图,再重新换一种描述方式。我们先上一个图。
相机坐标系,原点在相机的中心C,也是镜头的光学中心。Z轴是光轴,与像平面正交。Z轴穿过像平面,有个交点P,就是主点。相机坐标系定义了物体的三维坐标。例如,Q点。
图像坐标系,图像坐标系位于像平面,原点就是主点P。其坐标轴与相机坐标系的坐标轴是平行的。
像素坐标系,坐标原点在图像的一个角(为了区分左上角,我们称为一个角,这样放坐标系是为了好看)。
图中,CP之间的距离就是焦距f。
(1)相机坐标系与图像坐标系的关系
回到我们在第一章结尾提出的问题,如果我们知道Q点的坐标Q(X,Y,Z),我们想知道图像中这个点投影到了那个像素。也就是上图中q点的坐标是什么。我们再来推导一遍。先上图。
显然,根据相似三角形原理,q在相机坐标系中的坐标为:
q在图像坐标系中的坐标为:
对q加上一个齐次坐标,就可以写为:
(2)相机坐标系及图像坐标系与像素坐标系的关系
因为图像坐标系和像素坐标系之间有平移变换,所以,考虑到这些因素,从图像坐标系到像素坐标系就有如下关系(相机中感光器件每个像素的物力尺寸是dx * dy,udx及vdy就是实际的物理距离):
那么进一步的,
所以,fx和fy是这么来的。以上也是大多数博客讲解的内容,博主之前的博客也是这样写的。但是,还有另外一个问题需要考虑,实际的像素排列方式并不是矩形,有可能存在一个倾斜角。如下图所示。
这种情况下,像素坐标系和图像坐标系的关系就变得复杂了,用一个简单的示意图来说明。
我们真正想要的坐标就是那两个红蓝的叉叉处的坐标。所以,通过简单的三角函数计算,就有如下的公式:
最终,
最后,我们令
那么K就是最终的相机内参。这一点,很多博客,包括一些论文都没有提到。
(3)世界坐标系与其他坐标系的关系
世界坐标系是图像与真实物体之间的一个映射关系。我们还是以蜡烛作为例子,虽然我们已经构建了相机坐标系,图像坐标系和像素坐标系,但是,如果我想知道真实中这个蜡烛有多高,拍摄时,蜡烛离相机有多远。仅仅依靠这三个坐标系是不够的。这个时候我们就引入了世界坐标系。
在下图中,世界坐标系的原点是Ow,而Xw,Yw,Zw轴并不是与其他坐标系平行的,而是有一定的角度,并且有一定的平移。(详细的推导可以参考博主的第一篇博客)
将旋转,平移都考虑进去,则
进一步
R和T请参考我的第一篇博客。
上面的公式中,K(~)是内参矩阵,而R,T是外参参数。至此,我们就通过坐标系关系的推导,将相机的内参和外参讲明白了。
有了世界坐标系后,事情就好办多了。假设事先已经知道了内参和外参,那么相机随便拍摄一张图片,我就知道土拍你中目标物的位置和尺寸大小。至于怎么得到内参和外参,我们会在下面的内容做详细说明。
(4)关于齐次坐标系
很显然,在上面图像坐标系中,关于q的这样一个变换不是线性变换,那是因为坐标中有除法运算。此时,就引入了齐次坐标系。在第一篇博客中,我们大致说了为什么用齐次坐标系。我们只是说类似于透视变换,用于区分点和线。这一节我们进行推导。还记得那个图吗?
引入齐次坐标后,实际上就是对坐标加了尺度算子,只是表达方式发生了变化。例如,对于像平面上的q点,引入齐次坐标后,就有(我们用简单的形式,认为像素是矩形,且像素坐标系的坐标轴是垂直的)
怎么理解呢,我们用一个图来解释。
也就是说,在Q点投影线上的所有点,都会投影到像平面上的q点。
我们再看个图
如果两条铁轨之外,还有其他与之平行的线,那么这些平行线也会相交于相同的点。这就是透视效果。那为什么实际中的平行线,在像平面是相交的呢?我们来简单证明。
V0,V1,V2是平行线,D是向量方向。这些平行线的起点不一样,但是方向是一样的。对于任何通过向量V,且方向是D的直线,可以表示为
然后通过内参矩阵K做投影,
当t趋近于无穷时,
也就是说,真实的平行线,当平行线趋近于无穷时,在像平面上的投影,其投影相交于一点。
一个简单的理解就是,把D平移到相机中心,D与像平面的交点就是平行线在像平面的交点。
为什么呢?可以这样理解,因为D本身就是在相机坐标系中,而且是向量表示方法,可以看作是平行线的基向量,故D可以看作从相机坐标系原点出发的向量。又因为,像平面的平面方程在相机坐标系中的表示为Z=f,D向量与像平面的交点坐标为(D向量的终点不是交点,请注意那个箭头)
这个结果跟我们上面用投影矩阵推导的结果是一样的。所以,如果知道了平行线的方向向量,很容易就求得像平面上的交点。如果有人再提起为什么两条平行线会相交,你可以理直气壮的大声喊了。
(5)畸变模型
造成图像畸变的原因有很多,总结起来可以分为两类:径向畸变和切向畸变。一般情况下,我们会同时考虑径向畸变和切向畸变。那么,如果相机镜头是完美的,则真实世界的点坐标映射到像平面的点,其关系就应该是我们在前面所描述的那样。但是,实际上镜头并不是完美的,这就导致了实际上像平面的点,偏离了完美的那个像点。所以我们要去校正。用一个图来说明这种偏离。
图中dr是径向畸变的大小,而dt是切向畸变的大小。假设完美的映射点坐标是(x,y),畸变后的点的坐标是(x’,y’)。那么,满足如下的坐标变换关系
下面,我们来分别求解每一个畸变值。
(5.1)径向畸变
上图
模型推导:
径向畸变是由有缺陷的透镜的径向曲率引起的。根据众多的光学理论研究结果,径向畸变的变换值满足偶次多项式变换关系。也就是说
这一部分,如果读者有兴趣,可以参考文末的参考文献,里面有说明。
(5.2)切向畸变
切向畸变的示意图如下所示。
模型推导:
根据Brown-Conrady模型(请参考文末参考文献),切向畸变的畸变公式为
第三章 单目相机标定
在前面的章节中,我们已经构建了各个坐标系,并且也知道了各个坐标系之间的变换关系,同时,通过关系推导,得到了相机内参和外参矩阵。有了这些知识积累,对于单目相机的标定来说,已经足够了。但是,如何求解这个内外参矩阵呢?
本节主要参考张正友相机标定的一些知识。
https://www-users.cs.umn.edu/~hspark/CSci5980/zhang.pdf
另外还有各种各样的标定安装包,笔者认为第二章的内容是你用这些安装包的关键。而第三章只是一个大概的介绍,具体的推导过程就不说了。为什么?模型的构建过程是精髓,而模型的求解是工具。虽然两者缺一不可,但是本文专注于模型的构建过程,至于如何求解模型,直接用即可。同时我也相信,大部分同学真正关心的是第二章。(鄙人之见)
(1)张氏标定法
古老的做法是在相机的前面放上一个三维的标定板,执行如下的操作:
第一,在相机的前面放一个3D的标定板,测量三维标定板的各个参数,距离等
第二,相机拍照,提取图像关键点,根据坐标变换关系求解参数。
但是用3D标定板,其成本还是比较高的,而且可操作性不强。所以就有了后来的张正友标定法。方法思想是对同一个平面标靶,从两个以上的不同角度进行拍摄,对摄像机和标靶的移动方位不做限制,不需要得出移动参数;在标定过程中,假设摄像机的内部参数为常数,只有外部参数发生变化。
用张氏标定法求解摄像机参数时,大致可以分为两个步骤,第一是计算出标定板与像平面之间的单应性矩阵;第二是计算二次曲线映射矩阵。完成前两步后,就可以用前两步的结果,求得参数矩阵。
(1.1)计算单应性矩阵
关于单应性矩阵,可以参考我的另外一篇博客《都在这里了,从仿射变换到透视变换》。在第四章,我们还会再做一个深入的理解。
在齐次坐标系下,世界坐标系中的点M(Xw,Yw,Zw,1),都对应一个像平面的点m(u,v,1)。其映射关系为:
做进一步的参数替换简化
不失一般性,令2D平面参照物中每点Zw=0,则
H就是3*3的单应性矩阵。Hi是单应性矩阵 H 的第i列;R1、R2分别是旋转矩阵R的前两列,T与平移矩阵T相同。利用直接线性变换(DLT)算法计算单应性矩阵的初始值,然后用迭代方法优化最小化代价函数,计算出结果。
(1.2)计算计算二次曲线映射矩阵
首先,我们令
利用最小二乘方法求解可以求解到矩阵B的值。
当B矩阵和单应矩阵求解出以后,摄像机的内参数便可以由计算得出(参考文献二):
那么外参就可以由单应性矩阵和内参矩阵求得
知道这些东西就行了,没必要记住。
(2)opencv中的标定过程
在第一篇博客中,我们只是给了一个例子,这一节,我们大致给出opencv中标定的一个流程图。
是不是应该补一个实际操作实验?(博主手里正好有两个不同型号的某康网络摄像头,其中一个有畸变,将新开两篇博客,手把手教你标定单目和双目相机。同时也会把所有用到的图片,代码等都分享出来。关注公众号即可获得下载链接。)
第四章 再谈单应性
我们知道,单应性是从一个平面到另外一个平面的映射。假设我们有两间密室,两个不同的相机,两个一模一样的物体,两个不同的拍摄者。
假设两个像平面的基向量分别是a1,b1和a2,b2。相机中心到像平面上一个参考点(请注意是参考点,不是原点)的向量分别为d1和d2。(请自行对应第二章的图,加深理解)
现在的问题是,对于上面的情况,我们如何把第一幅图中的蜡烛通过一种什么样的变换关系转换为第二幅图中的蜡烛呢?
结合上图,对于像平面上的任何一个点,都可以用如下的向量公式来表示(X是空间点在相机坐标系坐标)
对于两幅图中蜡烛上的点,则可以分别用向量表示为
通过α和β,我们就知道了相对于每个像平面来说,X1和X2指向的是同一个点。
我们把公式用齐次方程表示
A和B是3*3的矩阵。在三维空间中(可以把两个房间合起来看),X1和X2之间的变换关系为
我们再来看像平面,由于相机的内参不同K1和K2,则在像平面,两个点的像平面坐标分别为(从相机坐标系变换为像素坐标系或图像坐标系)
w1和w2只是齐次坐标的尺度因子。(请参考第二章的内容)
那么将X2=TX1带如到上式中,得到
上面的式中,H就是单应性矩阵。单应的好处是,一旦我们有了它,我们就可以计算从一个投影平面到第二个投影平面的任何点的映射位置,我们不需要知道那个点的三维位置,我们甚至不需要知道相机的参数。
这就为我们下一章双目相机的标定提供了基础。请先记住这一点,可能现在看不出来有什么用。别急,往下看。
第五章 双目标定基本理论
还记得我们在第二章中的那个图吗?
在Q点投影线上的所有点,都会投影到像平面上的q点。也就是说单凭拍张图片,我们很难知道物体离我们有多远,尺寸是多少。
虽然现在有很多基于单幅图像的3维尺寸估计,但是这并不精确。比如说,朋友圈一直很流行的夸张图。
在用双相机做物体距离检测时,我们大致可以分为两种情况。两个相机平行放置,两个相机任意放置。
(1)相机平行放置
平行放置是指两个光轴是平行的,但是相互之间有一定的间距,这个间距的长度是已知的。两个相机的内参和外参也是知道,焦距相同。(右边的相机是左边相机平移一段距离后形成的新相机)下面这个图实际上是个三维的图,只是没有画坐标轴而已。请结合第二章的内容查看。
因为两个相机的焦距都是f,所以,直线C1C2和qq1之间是平行的。因为两个像平面在同一个平面内。又因为C1和C2在Y轴上的坐标是相等的,那么像平面内q点和q1点的y轴坐标也是相等的,即y=y1。而且,在投影线C1Q上的所有点都会投影到右边的像平面,而且不存在点的重叠。
既然这样,我们不妨调转视角,从上往下看。就是说朝着y轴的负方向看,此时就得到如下的示意图。
现在想求Q点离C1C2连线的垂直距离,也就是求解Q坐标中Z的值。
根据相似三角形原理,通过简单的推导,得到
(2)相机任意放置
相机平行的情况太特殊了,实际中,相机的参数不一样,摆放位置也不一样。但是如果按照实际的情况来计算,那将非常复杂。如果可以把任意的这种摆放位置,转换为我们熟悉那种平行模式,不就行了吗?我想看了前面这么多,大胆的想法就是找到左右两个坐标系之间的关系,把其中一个坐标系映射到跟另一个一致就可以了(这也是处理这种问题的一般思路)。现在,我们的目标就是找到这种转换关系。先上图。
这样一个双目系统,两个相机中心的连线C1C2穿过像平面,这条线与两个像平面的交点构成了两个外极点e1,e2。投影线C1Q上的所有点,都会投影到极点e2和投影点q2的连线上。同理的,投影线C2Q上的所有点,都会投影到极点e1和投影点q1的连线上。
那为什么会出现这种情况呢?因为,点C1、C2、Q共处于同一个平面内,那么投影必然会在一条线上。这个平面就是极平面。极平面与两个像平面有交线,就是上面两个图中的那个红色的线,这两条红线就是极线。
通过上图可以很明显的看到,当Q点的位置发生变化时,极平面和极线都会发生变化。但是有一点可以确定,极线一定是穿过极点的,而极点的位置是不会发生变化的。
在平行相机系统中,我们知道两个投影点的y轴坐标是一样的,而且两个相机之间距离也是知道的。这样我们才利用如此简单的公式做Q点距离的计算。
我们还是用上图来说明。假设已经知道了左边像平面上的一个投影点q1,那么根据我们前面所说的一些特性,在右边的像平面上与其匹配的投影点,肯定位于右边像平面的极线上。也就是,我只需要在这条线上找匹配点,而无需搜索整个图。既然在右边这条极线上寻找匹配的点,然后进行计算,那么就需要把右边这条极线按照一定的转换关系转换成根左边的极线平行,这样的话,不就可以进行测距了吗?
(2.1)F矩阵推导
假设我们已经知道了如下的投影关系,
特别的,当两个像平面平行时,极点在无穷远处。而且每个像平面的极线跟像平面的水平轴时平行的。(想象以下,把上图的两个平面使劲的往外掰,那么外极点也就越来越往无穷远处跑)
郑重说明:在写极线几何这一部分的时候,参考了很多博客、论文、教案。我发现大部分的博客都是按照本质矩阵和基本矩阵的模式来的。直到我看到了【参考三】的知识(可自行下载阅读),让我眼前一亮,而且容易懂,只是有个小地方需要注意(很多博客只是照搬,没有说明白,看的云里雾里),但博主已经给你打通了,不用担心。
右边像平面上的极线L2(穿过e2和q2的线)可以表示为
需要注意的地方就是这里,为什么是叉乘?叉乘的结果不就是垂直于叉乘的两个向量所在平面吗?我们来分析。
e2和q2均为3维齐次坐标,实际上就是点的向量。因为q2是齐次坐标,也就是说,对于每一个尺度因子w2,就对应C1Q线上的点,其在右边像平面上的投影都落在L2这条极线上,那么也就是说,每一个w2的值,就对应一个叉乘的结果,也就对应一个垂直的向量。所有垂直的向量就组成一个面,这个面刚好跟右边像平面垂直,两个面的交线就是极线L2。所以,L2表示为e2和齐次坐标的q2的叉乘是合理的。我们用一个示意图来表示。
理解的关键就是要知道,q2不是指一个点,而是一系列的投影点的表示。
在第四章中,我们已经知道,空间的点在两个像平面上的投影是可以通过单应性矩阵来联系的。即
那么就可以得到
F就是3*3基础矩阵。对于左边像平面上任何q1,都是通过这个基础矩阵进行映射成右边的极线。进一步的在上面等式两边乘以相同的项,得到
又因为q2在极线L2上,那么左边的项就是0,
通过这个等式,假设我们已经有了很多这样匹配的投影点对(q1,q2),那么我们就可以求解F矩阵了。
现在又回到了我们在上一节留下的问题,怎么找到这样的匹配点。
因为对于一个确定的双目系统来说,F矩阵就定了,我们只需要找到匹配的点对即可。找关键点的方法有很多,比如用SIFT特征来找(可参考博主另外的博客《完整理解SIFT算法》),我们只需要在左右两边的像平面找到特征点,然后做特征点匹配即可。假设我们已经找到了这样的匹配点对
那么就可以求解下式来取得F矩阵。我们把如下所有这样的公式展开,得到
因为F矩阵有9个未知量,有一个是尺度量(其他值除以F33),是8个量,所以最少需要8对匹配点才行。当然越多越好。
F矩阵有了,我们就可以找到左边像平面上点q1对应的右边像平面上的极线
极线有了,但我们还是不能用两个平行相机模型来计算距离。怎么办呢?也就是说,我们有了F之后,怎么把两个像平面搞成平行的呢?很多博客到这里就没有了,很不舒畅。
现有的一些研究成果(参考四)已经证明(原谅我这样说,因为这样非常有助于理解),当经过矫正后,左右两个像平面的极线在同一条水平线上的充分必要条件是矫正后的基础矩阵变为
那么,最终矫正过程就变成了,找到这样的一个3*3投影矩阵H1和H2,分别对左右两个像平面I1和I2做转换后,满足
求解出H1和H2后,就可以把任意的像平面做转换,转为极线在同一条水平线的情况,也就是两个相机平行的情况,然后求得距离。
怎么求解呢?我们把上面这个公式,和
结合,得到
也就是说,我们只要找到这些匹配点对(q1,q2),就可以求解了。
(2.2)E矩阵推导
关于大家所熟知的E矩阵,本文给出一个通俗理解。
在(2.1)节中,我们看到
而e2点是不同的极线L2在像平面上的交点,通过(2.1)节中的公式是可以知道的。而中间的转换关系T则可能包含平移和旋转。也就是说,两个相机之间,除了内参不一样外,还有空间上的平移和旋转关系(相机坐标系之间)。假设内参已经知道了,那么T就成为经常所说的E矩阵了。只不过,现在这个T把平移和旋转都考虑进去了。而E矩阵实际上也就是F矩阵的一个特殊形式。在历史上,也是先有E矩阵后有F矩阵,只不过本文所讲的叙事方向不一样而已。
这样的推导可能跟网上很多的推导不一样,但是,却对于理解双目标定是十分方便的。
写到这里,我的心情舒畅了很多。
参考一:Michael D. Grossberg, Shree K. Nayar. The Raxel Imaging Model and Ray-Based Calibration[J]. International Journal of Computer Vision, 2005, 61(2):119-137.
参考二:Zhang Z. A flexible new technique for camera calibration[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2000, 22(11):1330-1334.
参考三:https://www.robots.ox.ac.uk/~vgg/hzbook/hzbook1/HZepipolar.pdf
参考四:Seitz S M,Dyer C R.ViewMorphing[C].New Orleans, Louisiana:Proceedings of the SIGGRAPHICS' 96,1996:24-33.
希望通过本文的讲解,你已经理解了单目,双目相机的标定。
正好博主手上有两个某康的家庭用网络摄像头,其中一个存在明显的畸变,笔者打算把他们利用起来。将会另外开辟两个新博客,讲解实际的应用,并分享所有代码和图片,欢迎您的关注。如果您觉得本文对您理解单双目标定很有帮助,您可以关注博主的公众号分享给其他人,或者打赏。
-
2021年小目标检测最新研究综述
2021-08-16 01:02:16作者丨高新波、莫梦竟成、汪海涛、冷佳旭编辑丨极市平台导读与以往将小目标与常规目标等同对待或只关注特定应用场景下的目标检测综述不同,本文对小目标检测这一不可或缺且极具挑战性的研究领域进行... -
一个数组的值先从小到大递增后从大到小递减,找出最大的值
2018-04-26 17:50:36问题:给定一个数组,其值先从小到大递增后从大到小递减,找出最大的值。思路:最简单的办法就是从第二个值开始,判断是否满足 A[i] > A[i-1] && A[i] > A[i+1]. 如果满足,i 就是... -
基于改进SSD算法的小目标检测与应用
2022-04-02 16:17:31摘要:针对通用目标检测方法在复杂环境下检测小目标时效果不佳、漏检率高等问题,本文对SSD小目标检测算法进行改进。利用训练损失的反馈作为判断条件,结合数据增强提高模型对复杂环境的抗干扰能力,降低小目标的漏检... -
基于FPGA:多目标运动检测(手把手教学①)
2022-06-30 14:28:35本算法是针对已经进行了二值化的图像进行目标分割和标记。如帧差法运动目标检测算法,已经进行了帧间差、二值化、腐蚀、膨胀这些算法后得到的二值化图像。分割采样距离判别的方法,标记则采用矩形包围盒。 本算法... -
两阶段(two stage)目标检测原理详解 -- RCNN
2022-03-22 11:55:241.非极大值抑制(Non-Maximum Suppression,NMS) 2.对候选框进行坐标调整 (三)RCNN模型结构 1. RCNN的模型结构 2.R-CNN 总结 目前目标检测领域的深度学习方法主要分为两类:two stage 的目标检测... -
大学生极速成长系列教程—3.大学生如何在迷茫中寻找的奋斗目标与职业方向
2020-03-03 08:02:41迷茫焦虑是可以说是当代大部分学生一种常见状态,迷茫之人除了缺乏自信之外,大多数根本没有远期和近期目标,有些人可能不认同,觉得我明明给自己立了flag,其实所定flag其对自身而言是模糊和遥不可及,导致看不到... -
DL目标检测
2021-12-07 15:47:34目标检测YOLO系列归并排序 YOLO系列 Name Academy score score Harry Potter Gryffindor 90 score Hermione Granger Gryffindor 100 score Draco Malfoy Slytherin 90 score 归并排序 归并排序使用... -
目标检测中NMS(非极大抑制)的概念理解
2019-08-04 18:43:34目标定位和检测系列(3):交并比(IOU)和非极大值抑制(NMS)的python实现 一、NMS(非极大抑制)概念 NMS即non maximum suppression即非极大抑制,顾名思义就是抑制不是极大值的元素,搜索局部的极大值。在... -
实用数据分析:数据分析师从小白到精通
2020-01-02 20:10:01[入门数据分析的第一堂课] 这是一门为数据分析小白量身打造的课程,你从网络或者公众号收集到很多关于数据分析的知识,但是它们零散不成体系,所以第一堂课首要目标是为你介绍: Ø 什么是数据分析-知其然才知... -
小目标检测综述
2021-09-07 15:09:55为了进一步促进小目标检测的发展,本文对小目标检测算法进行了全面的总结,并对已有算法进行了归类、分析和比较。首先,对小目标进行了定义,并概述小目标检测所面临的挑战。然后,重点阐述从数据增强、多尺度学习、... -
算法:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数
2021-03-06 15:04:15给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。示例:给定 nums = \[2, 7, 11, 15\], target = 9因为 nums\[0\] + nums\[1\] = 2 + ... -
如何将数组中的数字按照从小到大的顺序排列???
2017-06-25 11:29:00如果要将数组中的数字按照从小到大的顺序排列。 完成思路:将最小的数字放在数组的第一项,将第二小的数组放在第二项,一直重复,知道完成。 那么如何将最小的数字放在数组索引为0的位置呢? 示例: for(int ... -
粒子群算法求解约束多目标优化万能matlab代码
2013-07-02 16:10:16粒子群算法 约束多目标 优化 matlab代码 -
输入任意三个数,按从小到大的顺序排序输出. (编程题)
2020-12-21 13:59:47编写一个程序,输入a,b,c三个值,按从小到大的顺序输出.C#编写一个程序,输入a,b,c三个值,按从小到大的顺序输出.C#staticvoidMain(string[]args){inta,b,c;Console.WriteLine("请输入三个数");a=ic语言:任意输入两个数... -
Python排序方法-列表排序sorted的用法:正数在前负数在后,整数从小到大,负数从大到小
2021-04-19 13:55:13Python排序方法-列表排序sorted的用法:正数在前负数在后,整数从小到大,负数从大到小sorted如何使用?使用函数进行此类排序操作 sorted如何使用? 关于sorted的用法:sorted是python里的一个常用高阶函数,能够进行... -
CVPR2021小目标检测:上下文和注意力机制提升小目标检测
2021-07-10 17:47:21摘要 在各种环境中应用目标检测算法...我们还提出了一种基于注意力机制的目标检测方法,该方法能够聚焦于图像中的目标,并且能够包含目标层的上下文信息。实验结果表明,该方法比传统的SSD在检测小目标上的精度更... -
力扣 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引
2021-06-17 16:28:21给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。 如果目标值不存在于数组中,返回它将会被按顺序插入的位置: int SearchInsert(int[] arr,int x){ for(int i = 0;i < arr.length;i++){ ... -
【目标检测】(6) YOLOV2 目标检测在V1基础上的改进
2022-03-27 14:12:46YOLOV1 尽管速度非常快,但精度低,定位性能较差,召回率低,检测小目标和密集目标的效果较差。因此 YOLOV2 做了如下的改进 1. Batch Normalization Batch Normalization 将神经元的输出减去均值除以标准差,变成... -
小目标检测中的数据扩展
2019-06-24 17:41:09论文:Augmentation for small object detection Abstract 这些年来目标检测领域经历了令人...除了这些改进,在小目标检测与大目标检测领域还是有不小的差距。我们在MS COCO上分析了当前SOTA的模型Mask-RCNN。... -
计算机视觉之目标检测
2021-06-24 14:04:43目标检测 1 定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标,并确定它们的类别和位置。 目标检测中能检测出来的物体取决于当前任务(数据集)需要检测的物体有哪些。假设我们的目标检测模型...