精华内容
下载资源
问答
  • 走进四维空间-我们如何理解时空

    千次阅读 多人点赞 2019-02-14 20:33:15
    张飞鸟,性子很燥,养不过夜的,我感觉疯子就是张飞鸟,天天骂骂咧咧的,而且还会摔倒… 大年初三看了《流浪地球》,非常...同时开一个脑洞,如果宇宙是四维的,三体人会不会就是学会脱水的地球人呢?只不过三体人...

    张飞鸟,性子很燥,养不过夜的,我感觉疯子就是张飞鸟,天天骂骂咧咧的,而且还会摔倒…


    大年初三看了《流浪地球》,非常不错,倒塌的终于不是自由女神像和金门中指桥了,陆家嘴上海中心大厦终于也塌了一次,不错!

    看完了电影,地球依旧继续流浪着走着,希望地球往半人马三星系统流浪的过程中遇到三体人并学习一下如何脱水。脱水很重要。同时开一个脑洞,如果宇宙是四维的,三体人会不会就是学会脱水的地球人呢?只不过三体人和流浪途中的地球人,不属于同一个四维坐标点…

    嗯,真可能。

    ( 活到现在就崇拜两部作品,《七龙珠》和《三体》,都是动不动就宇宙称帝,平行世界的那种… )

    缘起

    昨天下班回到家,临睡前我问了小小一个问题,如果平面上有一堵墙,挡住了去路,怎么能看到墙后面是什么,小小回答,从上面翻过去呗!

    非常棒!小小明白了从Z空间实施立体打击。

    接着我又问她,在盖着盖的不透明杯子里偷偷放一个东西,不打碎杯子,不掀开盖子,如何知道杯子里是什么?小小说这是魔术,这是假的。我告诉她,有一个世界里,所有的人只需要踮一下脚尖,测一下身,就能看到杯子里面了。小小说这简直太恐怖了…第二天,小小正告我,以后睡前不许再跟她讲这些恐怖的东西!

    除非我们家搬离这个寂静的小区…

    我错了,为了我的任性,我换了工作,全家人跟着我折腾,我们从一个欢快愉悦的小区搬到了一个寂静沉默的小区,并且换了城市,小小不喜欢…但是,这种状态不会太久的,我承诺。

    为我的小情人小小,写下此文!送给喜欢探索的小小!

    情人节快乐!


    四维空间不是四维时空。除了长宽高,第四维不是时间,它是什么,我也不知道,没有人知道,霍金也不知道,刘慈欣也不知道,大家都只是猜测。

    如果第四维是时间,那么一维世界和时间也能组成时空。四维时空只是为了方便爱因斯坦的广义相对论推理罢了,不必较真儿。如果我们把第四维看作和X,Y,Z一样对等的维度,我们会发现一些好玩的事情,比如变形金刚是如何变形的…

    让我用一篇中等篇幅的文章,诠释这一切!

    自己的解释

    我们先给出一个各个面不透明的三维物体在二维平面坐标系中的投影,如图所示:
    在这里插入图片描述
    我们假设一个二维生物在试图理解三维空间是什么样子的,正如我们企图去理解四维空间是什么样子的一样。

    平面ACEG显然对于这个二维生物而言是不可见的,因为对于这个二维生物而言,他能看到的只有ABHG,BDFH,GHFE这三个平面。换句话说,平面ACEG被挡住了,二维生物看到的将是下面的影像:
    在这里插入图片描述
    但是对于我们三维空间中的生物而言,只需要把这个物体平移一下,或者说旋转一下,再投影,ACEG就显示出来了:
    在这里插入图片描述
    这个过程我们三维生物看得是一清二楚,但是对于二维生物而言,平面ACEG就是突然冒出来的,无中生有啊!整个影像就这么神奇地莫名其妙 变形 了:
    在这里插入图片描述

    我们再看个例子,我们想象一下我们三维生物要对二维世界实施打击,二维世界的军队当然不能坐以待毙,他们部署了超级坚固的防御工事,比如像下面这样子的:
    在这里插入图片描述
    这种类似马奇诺防线般的自信,轻而易举就被纳粹般的三维世界来自Z方向的打击绕过并且轻松击溃:
    在这里插入图片描述
    对于二维世界而言,红色的弹道是不可见的,他们能感受到的就是突然出现(注意,这点很关键,是 突然出现 )的导弹对其粉碎性打击…
    在这里插入图片描述
    现在,我们来总结一下上面的事情:

    • 对于一维的直线
      一个点就能将其空间一分为二,左边看不到右边,二维情况下只需要在y̸=0y\not=0的位置就能全部可见
    • 对于二维的平面
      一个圆可以将其一分为二,外面看不到里面,三维情况下只需要在z̸=0z\not=0的位置就能全部可见
    • 对于三维的空间
      一个球可见将其一分为二,外面看不到里面,四维情况下只需要在g̸=0g\not=0的位置就能全部可见

    所以,低维度的世界对于高维度的世界,完全没有任何秘密!高维世界只需要在比低维世界多出来的那个维度上踮一下脚尖,就能把低维世界的全貌看得一清二楚!

    我们类比下面三维立方体在二维平面的投影,来画一个四维立方体在三维空间的投影,然后来看看有什么神奇之处。

    先再来看一下三维空间在二维的投影:
    在这里插入图片描述
    如果我们旋转一下立方体或者换个角度再去投影,就是下面的样子
    在这里插入图片描述
    咦?G点原来在E点的左边,怎么就跑右边去了呢?这对于二维世界是不可理解的,如果二维世界可以如此乱来,必然会导致刚体被扭曲粉碎。

    同理,我们可以画出一个四维刚体物体在三维空间的投影:
    在这里插入图片描述
    很显然,在我们三维世界看来,投影中小立方体藏在大立方体的内部,被大立方体的面遮挡,对外界不可见,然而对于四维世界而言,这不算什么,只需要旋转一个哪个四维物体,或者换一个角度再投影,投影就会成了下面的样子:
    在这里插入图片描述
    原本藏在里面的小立方体马上暴露了出来!

    在三维世界,这会导致大立方体的面被冲破粉碎,相当于把小立方体从里面生生给拽了出来,这是不可能的。但是请注意,这并不是三维世界的两个嵌套的立方体,这是四维物体在三维空间的一个投影而已。

    我们三维世界的人,虽然看不见四维物体,但是却是可以看到四维物体的投影的。

    只不过,如果我们看到四维物体在三维世界的投影,会不知所措!会是什么感觉呢? 应该是跟看到变形金刚变形时的感觉一样吧… 想象一下山姆第一次看到自己破旧的雪弗兰变成汽车人大黄蜂的情景…

    明明一个刚硬的物体挡在另一个刚硬物体后面,瞬间它就跑到前面来了,在我们三维空间定义中的里面的东西瞬间被抛到了外面,一切变化都不是连续的,一切都是突然的。(请再次揣摩《三体》中对四维空间的描述)

    为了理解这个过程,我们仍然以三维物体在二维世界的投影为例,假设一个正方体垂直投影到了二维平面,然后旋转这个正方体,二维世界将会看到一些违背常理的事情:

    • 面积突然增加,突然减小;
    • 刚体不再刚硬,物质不再守恒;

    虽然这只是影子,但是对于二维世界而言,守恒定律被打破了,正如我们三维世界里一根棍子不可能凭空加长缩短一样。

    如果我们假想一个三维立方体垂直或者斜着穿过一个二维平面,对于在该二维平面上生活的生物而言,就更加不可思议了,请自行想象。

    现在我们开始尝试见招拆招地理解四维世界。

    我们都曾努力去想象四维物体对的形状,但是基本上都失败了。因为对于我们而言,三维就是整个世界!

    然而,我们还是可以感受到四维世界的存在,只是我们无法去描绘它!无法描述的东西并非意味着你感受不到,比如像恐惧之类的情感元素,人们也经常用 可描述不可描述 这种柏拉图式的分类来区分 理性感性, 来区别 科学迷信。殊不知这在根本上是由我们人类的感觉器官决定的!这个我在后面会谈。

    让我们试着去感受一下四维空间。

    还是先回到二维世界,我们看看二维世界如何去感受对我们而言稀松平常但对他们来讲却不可描述的三维世界。

    还是以攻击和防御为例。

    当二维军队遭受三维世界来自 Z轴方向 的打击时,可想而知,他们是不能解释这种打击的原理的,但是我们可以帮他们用他们能理解的方式去学习到这个过程的原理,对于他们而言,我们就是上帝。我们有责任救他们于水深火热般的落后状态,正如200年前英国传教士对待我们一样。

    我们会告诉他们,存在很多和他们一样的平行二维世界,这对于他们而言是难以接受的,但依然是可以理解的,这并不神奇。只要不是超乎想象的东西,都是可以理解的。既然他们能描述自己的二维世界,告诉他们其实存在很多这种二维世界,他们中一定有高瞻远瞩之人会首先接受这个事实。

    然后,我们再告诉他们,这些世界是完全平行的,彼此是不可能有任何交流接触的(这对于我们而言是很显然的,因为这些世界都没有Z轴的概念,它们全部平行于X-Y平面,正交于Z轴,它们之间的任何交流都必须在Z空间进行,但对于二维世界的人而言,我们没法跟他们解释原理,暂且先告诉他们事实),但是,请注意,如果一旦这些平行世界时间建立了交流,那么就可以抵挡三维世界的攻击了。

    这就像携有飞机大炮这种三维攻击武器的现代军队打击非洲或者亚洲的旧时冷兵器军队时那样。立体打击当然需要立体防护…

    那么具体该怎么办呢?

    三维世界总是会有希望解救二维世界的好人,帮助他们。比如如果是我,我就会帮助他们,我会说: “我帮助你们这些平行世界交流,以我为中心,我是你们的上帝,除我之外,你们不能再崇拜任何神!”


    你们不是已经建立了一个环形的防御工事吗?只可惜这个是二维的,对我们从Z方向的攻击不起作用,那么如果沿着Z轴,和你们的世界紧挨着的那个世界部署一个稍微小一点点,仅仅挨着你们那么环形防御工事的工事,以此类推,直到某个二维世界的该防御工事锁成一个点,你们这些所有参与构建防御工事的二维世界,将可以联合起来抵挡我们的攻击!
    在我们看来,你们所有这些参与者世界,构建出了一个防御罩子,我们的攻击将被这个罩子挡住。
    这对你们来讲,听起来有点不可思议,但是我会帮你们构建这么一个玩意儿。

    1. 我先把你们的环形防御工事投影到下一个世界;
    2. 我告诉紧贴着你们世界的下一个世界紧贴着这个投影在内侧构建一个环形防御工事;
    3. 重复1和2,直到某个世界的环形防御工事缩成一个点!

    这个玩意儿在我们看来,就是一个空心的球,但是对于你们而言,你们理解不了球的概念,可是你们能理解的是:

    1. 这个玩意儿如果从对你们而言不可理解的那个Z轴来看(垂直于X-Y平面),就是一个以你们防御工事为半径的实心圆;
    2. 这个玩意儿如果对于你们每一个参与者二维世界而言(平行于X-Y平面),就是一个逐渐缩小的空心圆。

    换句话说,对你们而言,这玩意儿是一个 组合物体
    你们理解了吗?

    防御体系如下:
    在这里插入图片描述


    好吧,你们可能理解了,但我还没有碰到四维世界的好人。不过我可以尝试着用我帮助别人的方式去揣摩我的上帝如何帮助我。

    我们听过很多关于 平行世界 的故事,看来要理解四维物体,真的要用上了。
    我们可以理解平行世界的存在,嗯,是的,假如宇宙是四维的,那么三维的平行世界将会弥漫整个宇宙空间,换句话说,每一个三维世界将是四维宇宙沿着那个我们不可理解的坐标轴,比方说 G轴一层切片 。假如四维人要对我们的世界进行沿着G轴方向的打击,我们应该怎么办?

    前文的描述我们已经可以理解,躲在一个坚硬无比的防弹球里是无济于事的。那么我们学着二维世界对抗三维世界打击的做法,让多个三维世界联合起来。假设有上帝的存在,并且我除了崇拜我的上帝之外,已经打碎了所有其它偶像,别无崇拜,现在的问题是,最终构建起来的联合防御工事将是一个什么样的存在?

    我们是不可描述这种存在的,但是我们可以将它分解,将它分解成其在三维世界各个世界以及平行于G轴的投影,这样投影的结果就是一系列的三维物体了,而这是我们可以理解的:

    1. 这个玩意儿如果从对我们而言不可理解的那个G轴来看(垂直于X-Y-Z平面的投影),就是一个以我们的坚固无比的球形防御工事为半径的实心球;
    2. 这个玩意儿如果对于我们每一个参与者三维世界而言(平行于X-Y-Z平面的投影),就是一个半径逐渐缩小的空心球。

    换句话说,对我们可以理解的视角而言,这玩意儿是一个 组合物体

    这看起来有点没有正面回答问题,毕竟这是以我们三维世界的视角来看的,现在假设我是一个四维生物,站在四维空间里来看这个物体,它会是什么样子?

    这不是又把问题绕回来了吗?刚刚不是还说我们根本就无法描述四维物体吗?我为什么一直不断的重复其实是一个意思的问题…

    且慢!问题来了!我们不要以为自己对三维世界就是了如指掌的!

    我们生活在三维世界,敢问谁能一下子看清楚三维物体?

    这里的问题在于,我们所有看到的三维物体,都是它在我们视网膜上成像后的二维投影,所以说,下面的画法实际上是二维的,而不是三维的:
    在这里插入图片描述
    它明明被画在了纸上,被画在了屏幕上,最关键的,它被投影到了我们的视网膜上!

    只要你理解这是在一张二维的纸或者一块二维的屏幕上作图,而不是在立体的物件上雕刻,你就明白, 我们观察三维世界,事实上都是以二维的视角来观察的! 这点非常重要!没有任何人可以在单独的一点,看到一个三维物体的全貌!

    还是上图,如果没有坐标刻度,仅凭这个图,你根本无法辨识这是一个正方体还是一个长方体,或者是一个斜方体,因为我们看到的只是一个投影,而投影的方式有很多种,比如正投影,透视投影,3D眼镜投影等等。

    我们观察三维世界的方式竟然是在二维世界进行的。

    同理,二维生物在二维平面世界,也无法看到一个二维圆的全貌,他们只能看到一条一维的线,如果他们试图感受这个物体的真实形状,不得不绕着它走一圈确认回到了原点,然后再基于一个不动点做参照物,经过一系列的计算,证实其曲率是一致的,从而得到 这是一个圆 的结论!

    以上这个过程就像大航海时代达伽马,麦哲伦所做的那样。

    二维视角只能看到一维,三维视角只能看到二维,不识庐山真面目,只缘身在此山中。

    拿到一个三维物体,我们观察它的方式是不断地扭转它,就像古玩爱好者品鉴一个文物一样,从不同的视角去看,目的就是获取其在不同方向的二维投影,谁让我们的眼睛是二维的呢…

    还是上图,横看成岭侧成,远近高低各不同,我们要如下观察它才能获得其全貌:

    • 视角1:垂直看
      在这里插入图片描述
    • 视角2:上方斜看1
      在这里插入图片描述
    • 视角3:上方斜看2
    • 在这里插入图片描述
    • 视角4:上方斜看3
      在这里插入图片描述
    • 视角5:侧斜看
      在这里插入图片描述

    所以说,既然我们能通过二维观察到三维,我们就能通过三维观察到四维。

    现在轮到我们用同样的方法来描绘四维物体了。

    我们就来描绘一下足以保护我们的那个四维罩子球,假设我们已经到了四维空间,我们有了四维生物的能力,由于 只缘身在此山中,所以即便是四维人,也只能以三维的视角来观测四维物体。四维人通过不同视角得到四维物体的不同投影,进而去感知这个四维物体。

    • 视角1:平行于G轴垂直于X-Y-Z
      在这里插入图片描述
    • 视角2:侧斜看1-稍微大一点的空心球
      在这里插入图片描述
    • 视角3:侧斜看2-稍微小一点的空心球
      在这里插入图片描述
    • 视角4:上斜看-椭球
      在这里插入图片描述

    一个可以把我们三维世界的空间罩起来的四维球,如果一个四维人从不同侧面看其在三维空间的投影的话,基本就是上面的样子:

    • 只要投影投射方向在X-Y-Z空间有分量,它就是一个实心的球或者椭球,取决于投射方向在X-Y-Z轴的分量;
    • 如果是在垂直于G轴的方向投影,它就是一系列半径不同的空心球,取决于G轴分量的大小。

    那么,如果这个罩子能不能不是四维球形呢?换句话说,我们能不能不同的三维平行世界的正方体堆一个四维正方体来抵御四维攻击呢?

    非常简单,完全可以,方法和上述的是一致的,但是要想画出其在四维空间不同视角下的投影就比较麻烦,之所以用四维球举例,因为 点-圆-球-四维球-… 一脉相承般的简单优美。

    但如果换成立方体的话,再麻烦最终也不外乎是变形金刚变形过程快照的样子,类似下面这种:

    在这里插入图片描述
    请记住,即便是上述,我们从不同角度描绘了四维物体在三维的投影,最终它还是以二维展现的,毕竟屏幕是二维的。

    现在来看我们的 终极困难!

    我们的困难不是如果去描绘一个四维物体,而是, 给出一个四维物体的一个或者多个视角的投影,我们无法去想象它的全貌! 对于三维物体,虽然我们最终也是要投影到二维来描述,但是它仍然能给我们带来一种 立体感 ,让我们明白 这个物品是朝着三个方向延伸的 ,这是由于我们的眼睛构造决定的。

    我们的 立体感 来自于我们的 眼珠子会旋转的双眼 所捕获的 多张二维图像 在大脑中被综合处理的结果!!!这个结果让我们可以通过明明是二维的平面投影感受到一种立体感!

    试着做一个简单的实验!

    保持双眼看一个物体,睁一只眼,闭一只眼,然后轮换,睁另一只眼,闭另一只眼。

    两个眼睛看到的同一个物体是不是有一定的位移,换句话说,同一个物体,两只眼睛看到的是不同的影像,这意味着这同一个物体在两只眼睛的视网膜上的投影是 不同的!

    不光是两个眼睛捕获了两张不同的投影,只要眼珠子稍微转一下,又是两张不同的投影,身子稍微侧一下,头稍微扭一下,又是N多张不同的投影。

    同一个物体,却出现了不同的投影,这是矛盾的!所有这些同一物体的不同投影背靠背地通过视神经被送入了我们的大脑!

    我们的大脑帮我们解决了这个矛盾,保护我们的世界观不至于崩塌,把所有这些不同的投影统一到了一个物体上,告诉我们 这其实真的就是同一个物体!

    大脑把一种叫做 三维立体感 的感觉给了我们,从而让我们意识到 自己生活在一个可以朝着三个互相垂直正交的方向延伸的世界中!

    欢迎来到三维世界,这就是我们的世界!


    这里可以展开一段关于透视的东西,以解释下面的同样包络面的两个图,为什么一个给人的感受是平面的,另一个是立体的:
    在这里插入图片描述
    因为人的大脑已经形成了几种透视模式,知道了什么投影是合理的三维投影,如果是不合理的,人的大脑就干脆将其降维到二维去处理。

    好了,该说说3D眼镜了。

    我们看到的所有的屏幕上的东西,都是二维的平面的再投影。然而3D眼镜玩了一个把戏,让我们觉得画面是真实投射到眼睛视网膜上的物体的投影,而不是纸面上的二维投影的再投影。

    3D图像其实是把两张投影按照透视位移重叠在了一张画布上,当我们戴上3D眼镜的时候,一个镜片看到一张投影过滤掉另一个,而另一个镜片则看到被第一个镜片过滤掉的那一个,其实,这是在模拟人的双眼捕获两张不同的投影的效果。这是一场骗局!

    在这里插入图片描述
    3D画面往往夸张和增强了立体感,让你感觉这比现实更加立体!实际上一下子就能揭穿这个把戏,歪歪头,你并不能看到变化,你看不到物体后面在歪头前挡住的部分。


    但是,对于四维物体的投影,我们无法想象它是沿着四维的方向延伸的,因为我们没有任何器官采用任何类似我们眼睛的机制去感知到第四维!我们的眼睛通过视神经已经固化了几种透视模式,所以说,让我们闭上眼睛!

    闭上眼睛我们也还有记忆…

    所以我们不知道在盲人或者聋哑人的视角,世界到底是几维的。或者说鹰,猎豹,细菌,病毒感知到的世界,和我们感知到的世界有什么不同。


    正式的东西

    最后说点正式的的东西。

    1. 物体突然出现,突然消失的灵异事件,大概率是真的
      我们不可理解,但是在高维度,这是再平常不过的事情
    2. 闵可夫斯基的四维坐标系第四维是时间,这其实并不妥当
      凭什么第四维的单位不是米而是秒?这不公道!虽然我们知道,地球的轨迹是一条螺旋线而不是圆环,但又能怎样呢?
      你要明白,我能用长度度量时间!
    3. 我相信有人类可以感知到第四维
      像埃舍尔的画作一样,作者无法诠释四维空间,但是他画出来了:
      在这里插入图片描述
      一群人沿着向上的阶梯走一圈,为什么又回到了原点?!
    4. 几年前我也思考过的问题
      如果我爬楼梯上东方明珠,登顶之后开门一看,还是地面,怎么办?后来,在2017年春节,我去了重庆洪崖洞,感受到了这种震撼!
    5. 人类实际上已经探索过很多关于维度的问题了
      证明地球是圆的只是其中的引子。后来的几何学更是从理论上说明了问题。非欧几何上的一条一维的线,在欧氏几何中竟然不是一维的…所以说,到底是几维,这是人说了算的。
    6. 不要忘了莫比乌斯带,但不要过度沉迷
    7. 到了杭州,诸事不顺,难道因为这里有白素贞,许仙,法海还有岳飞?一堆冤魂?搞不好有看不见的眼睛呢…
    8. 下一篇文章,我想写一篇关于《七龙珠》和《三体》的
    9. 想起来再补充…

    浙江温州皮鞋湿,rain flooding water will not fat!

    展开全文
  • 作者:书涵 Date:2020-02-04 来源:系列篇|单目结构光三成像系统的标定方法 ...不过,真正计算出物体的三解,需要对单目结构光系统进行精确的标定。当把投影仪“看成”相机时,单目结构光系...

    作者:书涵
    Date:2020-02-04
    来源:系列篇|单目结构光三维成像系统的标定方法


    在上篇文章——系列篇|结构光三维重建基本原理中,笔者介绍了单目结构光三维成像系统把投影仪“看成”相机的模型。基于这个模型,单目结构光三维成像系统可以像双目三维成像系统那样来获取空间中物体的三维信息。不过,要真正计算出物体的三维解,需要对单目结构光系统进行精确的标定


    当把投影仪“看成”相机时,单目结构光系统需要计算的标定参数和双目成像系统类似,分别是相机的内参矩阵Kc和投影仪的内参矩阵Kp,以及相机和投影仪之间的外参矩阵:旋转矩阵R和平移矩阵T。此外,由于相机和投影仪的镜头都不可避免的存在畸变,我们还需要标定出相机和投影仪的畸变系数dc和dp。

    同样地,我们可以像标定双目成像系统那样标定单目结构光系统。根据张正友标定法,我们可以用棋盘格标定板标定出相机的内参矩阵和畸变系数。同理,如果我们能够知道标定板在投影仪下的“成像”,我们就可以像标定相机那样求出投影仪的内参矩阵和畸变系数。如果能够知道标定板在相机和投影仪中同时成像的位置,我们就可以对相机和投影仪进行双目标定计算,求得投影仪和相机之间的外参矩阵R和T。

    由于张正友标定法及双目标定计算在网上的资料有很多,笔者就不在这里赘述。在这篇文章中,笔者将详细介绍如何准确获取标定板在投影仪下的“成像”,从而精确的标定出投影仪的参数。

    投影仪是无法直接“看”到三维空间中的标定板的,更不要说提取棋盘格标定板的角点。所以要完成投影仪的标定,我们还是要依赖于相机首先,我们用相机拍摄空间中的棋盘格标定板,并提取出拍摄到的棋盘格标定板的角点,然后,我们需要使用投影仪把编码后的光依序投射在棋盘格标定板上,并对相机图片拍摄的投影仪的光编码进行解码。最后,我们要找到相机图片中棋盘格标定板的角点所对应的投影仪“图片”中的像素。这样就可以使投影仪“看到”标定板,或者说看到标定板上有效的特征点(角点)。

    在上述过程中,找棋盘格角点本来就是相机标定必须经历的步骤,光的编码和解码方式也有很多,原则上可以使用任何光编码,包括格雷码,相移,多频外差,甚至彩色光编码等。只要能保证编码和解码的准确性都可。重要的是,如何使得投影仪能够精确“看到”棋盘格标定板上的角点,或者说如何保证相机图片中获取的角点到投影仪“看到”的角点的映射的准确性。

    通过对相机的每个像素进行光解码,我们可以得到每个相机像素点对应的投影仪像素点。最简单的想法是,直接把相机棋盘格图片上每个角点对应的相机像素点直接对应到其解出的投影仪编码位置上。然而这样做通常无法得到棋盘格角点在投影仪图片上的准确映射,原因如下:

    1)我们相机上找到的特征点(棋盘格角点)通常是亚像素级的,而解码只能得到相机图片上每个像素对应的投影仪编码位置。

    2)对于某些编码方法,如格雷码,只能对投影仪的每个像素进行编码,即解码后的精度也只能是像素级的。

    3) 通常情况下,投影仪的分辨率会比相机低,这意味着,相机上相邻几行可能对应投影仪图片上同一行,相机上相邻几列可能对应投影仪图片上同一列。

    4)对单个像素而言,解码可能存在误差或者解码结果是不确定的(即该点由于种种原因无法解码)。

    如果刚好在角点位置处的解码被判断为不确定点,事实上这种情况非常有可能(稍后会介绍),会导致部分角点位置没有解码结果,从而不能被投影仪“看到”或者“看到”的角点误差特别大,导致标定结果误差很大甚至无法使用。

    为了解决上述问题,布朗大学团队提出了一个简单易行的方案,通过对相机中看到的每个特征点(棋盘格角点)求局部单应性矩阵,再通过每个特征点(棋盘格角点)求到的局部单应性矩阵把相机图片上棋盘格角点映射到投影仪图片上,这样就可以得到棋盘格角点在投影仪图片上的准确成像位置,且每个角点在投影仪图片上的成像坐标是亚像素级的。

    如图所示,captured image 表示的是相机图片,projected image 表示的是假想的投影仪图片。利用相机图片中每个角点附近的像素点集及其对应的解码坐标,计算一个局部单应性矩阵H,然后把相机图片上的角点P与单应性矩阵相乘,就可以得到棋盘格角点在投影仪图片上的成像位置q。需要注意的是,我们要对一幅棋盘格图片上的每个角点都单独计算一个局部单应性矩阵H,如图中所示,如果棋盘格上有n个角点,则每幅棋盘格图像要计算n个局部单应性矩阵。

    局部单应性矩阵的计算方式如下,对相机图片上一个角点,假设其在邻域上有m个像素存在有效的解码坐标,则利用这m个像素点集{p}及其对应的投影仪图片像素坐标集{q}(解码结果),我们可以建立如下方程:(p和q均为齐次坐标)

    在这里插入图片描述
    即找到一个3x3的矩阵H,使得这m个有效像素点p乘上H后和实际的解码坐标q的距离和最小。其实这个很好理解,就是找到一个矩阵,使得角点附近每个像素点p经过转换后和其实际在投影仪图片上的真实值q误差最小。这个H就是我们要计算的局部单应性矩阵。

    关于棋盘格角点邻域的范围,笔者的建议是,适量,且不宜过少。过少的话,结果偏差过大,过大的话有可能你的邻域出了棋盘格标定板边界,如果存在一个点不和棋盘格标定板在同一个三维平面上却被用来计算单应性矩阵则会引入较大误差。有读者应该已经注意到,这里一直强调的是局部单应性矩阵,为什么不用全局单应性矩阵呢?即对整个标定板上的点计算一个单应性矩阵,然后拿每个角点乘同一个单应性矩阵不行吗?我们知道,像这种求最小H,越多合适的点引入计算其实结果越稳定。不过撇开计算量不说,也存在如下所述的不适宜只求一个全局单应性矩阵的原因。

    简单来说,由于镜头畸变的存在,在三维空间中的不经过光心的直线在投影仪中的“成像”并不是一条直线,这种畸变导致的直线形变是非线性的。因此我们的标定不仅仅只是一个线性参数,我们要求得的标定结果中除了有投影仪内参矩阵(线性),还有一个很重要的参数是畸变系数,畸变系数是非线性的,而我们求的单应性矩阵H是一个线性变换。如果每个点都用同一个H变换,会无法保持角点成像本身排列的非线性特性,直接影响我们求得投影仪的畸变系数的准确性。

    至此,我们就可以很轻易的标定投影仪了,因为投影仪可以准确“看到”空间中棋盘格标定板的角点,我们只需要把投影仪放到相机模型里进行参数求解就可以了。

    在实际应用中,由于投影光容易受到外界环境影响,具体体现在光投射在黑色物体上容易显得过暗,而光投射在白色物体上就会显得很亮,棋盘格标定板因为其既有黑色格子又有白色格子,无法保证在同一投影仪光强下,同时满足黑色棋盘格区域和白色棋盘格区域的解码需求。实际上,黑色物体的光解码是结构光的挑战之一。棋盘格的这种特性,给实际的解码提出了比较大的挑战。在实际应用时,有些论文会主张蓝白棋盘格,并投影红光,来避开棋盘格黑色部分带来的挑战。更多的是使用黑底白圆的棋盘格,如下图所示,圆心附近的点是白色,很适合光解码,可以有效避开黑色带来的解码困难问题。
    在这里插入图片描述

    最后笔者在这里总结下单目结构光系统的标定步骤

    步骤一:获取相机拍摄的标定板图片,保持标定板不动,依序投影结构光编码到标定板上

    步骤二:找到标定板图片中的特征点坐标

    步骤三:对相机拍摄到的投影结构光进行解码

    步骤四:对每个找到的标定板图片中的特征点坐标求局部的单应性矩阵,并使用局部单应性矩阵计算出特征点在投影仪图片上的坐标

    步骤五:改变标定板位姿,重复步骤一到步骤四

    步骤六:重复步骤五至少三次,并利用找到的特征点在相机和投影仪中的坐标分别计算出相机内参矩阵和畸变系数,投影仪内参矩阵和畸变系数。

    步骤七:利用找到的特征点在相机和投影仪中的坐标值进行双目标定计算,得到相机和投影仪之间的外参矩阵:旋转矩阵R和平移矩阵T。

    本篇文章主要介绍的是布朗大学团队提供的方法,他们也提供了方法介绍的网站,且网站上有他们写标定源码供参考。

    参考文献:Simple,Accurate,and Robust Projector-Camera Calibration。

    代码链接:http://mesh.brown.edu/calibration/

    小凡备注:本文作者为我们星球的特邀嘉宾,期待更多有识之士来稿,对于结构光系统的标定,也欢迎大家多多探讨,一起进步~

    上述内容,如有侵犯版权,请联系作者,会自行删文。

    重磅!3DCVer-学术交流群已成立

    欢迎加入我们公众号读者群一起和同行交流,目前有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

    长按加群或投稿

    展开全文
  • 计算机视觉()--关键点

    万次阅读 2017-09-30 15:55:28
    关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知...比如1的函数(信号),有各种手段去得到某个所谓的关键点,有极值点,拐点...二的图像,特征点提取算法是标定算法的核心(harris),

    关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知对低层次处理手段的妥协。

    RangeImage

    1.关键点,线,面

      关键点=特征点;

      关键线=边缘;

      关键面=foreground;

      上述三个概念在信息学中几乎占据了统治地位。比如1维的函数(信号),有各种手段去得到某个所谓的关键点,有极值点,拐点...二维的图像,特征点提取算法是标定算法的核心(harris),边缘提取算法更是备受瞩目(canny,LOG.....),当然,对二维的图像也有区域所谓的前景分割算法用于提取感兴趣的区域,但那属于较高层次的视觉,本文不讨论。 由此可以推断,三维视觉应该同时具备:关键点,关键线,关键面三种算法。本质上,关键面算法就是我们之前一文中讨论的分割算法(三维点云不是实心的)。

      ok,在这里我们了解到了,要在n维信息中提取n-1维信息是简单的,但n-2维信息会比n-1维要不稳定或者复杂的多。很容易想象,图像的边缘处理算法所得到的结果一般大同小异,但关键点提取算法的结果可以是千差万别的。主要原因是降维过大后,特征的定义很模糊,很难描述清楚对一幅图像来说,到底怎样的点才是关键点。所以,对3维点云来说,关键点的描述就更难了。点云也有1维边缘检测算法,本文不做讨论。单说说关键点提取。

    2.来自点云的降维打击

      图像的Harris角点算子将图像的关键点定义为角点。角点也就是物体边缘的交点,harris算子利用角点在两个方向的灰度协方差矩阵响应都很大,来定义角点。既然关键点在二维图像中已经被成功定义且使用了,看来在三维点云中可以沿用二维图像的定义...不过今天要讲的是另外一种思路,简单粗暴,直接把三维的点云投射成二维的图像不就好了。这种投射方法叫做range_image.

      首先放上一张range_imge和点云图像的合照:

      看起来像个眼睛的那玩意就是range_image. 至于它为什么像个眼睛,就要从它的出生开始说起了。三维点云有多种采集方式,最为著名的是结构光,飞秒相机,双目视觉。简而言之,采集都离不开相机。用相机拍照当然就存在相机的光心坐标原点 Oc 以及主光轴方向 Z. 从这个点,有一种办法可以将三维数据映射到2维平面上。首先,将某点到光心Oc的距离映射成深度图的灰度或颜色(灰度只有256级但颜色却可接近连续变化)。除此之外,再定义一下怎样将点云映射到图像的横纵坐标上就可以了。

      任意一点都要和光心进行连线.....这么听起来很熟悉....好像有点像球坐标的意思。球坐标长下面这张图这样。在数学里,球坐标系(英语:Spherical coordinate system)是一种利用球坐标(r, θ,φ)表示一个点 p 在三维空间的位置的三维正交坐标系。右图显示了球坐标的几何意义:原点与点 P 之间的径向距离 r ,原点到点 P 的连线与正 z-轴之间的天顶角

    θ
    以及原点到点 P 的连线,在 xy-平面的投影线,与正 x-轴之间的方位角φ

      

      深度图中的横,纵坐标实际上是θ和φ,如果要保证沿着场景中某条直线移动,φ线性变化θ却先增大后减小。这也就造成了深度图像一个眼睛一样。但这并不妨碍什么,φ没有定义的地方可以使用深度无限大来代替。

      将点云转成深度图,只需要确定一个直角坐标系,角分辨率,θ范围,φ范围即可。毕竟这只是一个直角坐标转球坐标的工作而已。

      这样做显然是有好处的,首先,这是一种除了八叉树,kd_tree之外,能够将点云的空间关系表达出来的手段。每个点云都有了横,纵,深,三个坐标,并且这种坐标原点的设定方式,在理论上是不会存在干涉的(从原点出发的一条线理论上不会遇到多余1个点)。于是点云的空间关系就自然的被编码与深度图中。

      显然,图像中的关键点检测算子就可以被移植到点云特征点求取中来了。

    3.基于PCL的点云-深度图转换

    复制代码
    //rangeImage也是PCL的基本数据结构
    pcl::RangeImage rangeImage;
    //角分辨率
    float angularResolution = (float) (  1.0f * (M_PI/180.0f));  //   1.0 degree in radians
    //phi可以取360°
      float maxAngleWidth     = (float) (360.0f * (M_PI/180.0f));  // 360.0 degree in radians
    //a取180°
      float maxAngleHeight    = (float) (180.0f * (M_PI/180.0f));  // 180.0 degree in radians
    //半圆扫一圈就是整个图像了
    
    //传感器朝向
      Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
    //除了三维相机模式还可以选结构光模式
      pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
    //noise level表示的是容差率,因为1°X1°的空间内很可能不止一个点,noise level = 0则表示去最近点的距离作为像素值,如果=0.05则表示在最近点及其后5cm范围内求个平均距离
      float noiseLevel=0.00;
    //minRange表示深度最小值,如果=0则表示取1°X1°的空间内最远点,近的都忽略
      float minRange = 0.0f;
    //bordersieze表示图像周边点  
      int borderSize = 1;
    //基本数据结构直接打印是ok的
      std::cout << rangeImage << "\n";
    复制代码

    NARF描述子 

    关键点检测本质上来说,并不是一个独立的部分,它往往和特征描述联系在一起,再将特征描述和识别、寻物联系在一起。关键点检测可以说是通往高层次视觉的重要基础。但本章节仅在低层次视觉上讨论点云处理问题,故所有讨论都在关键点检测上点到为止。NARF 算法实际上可以分成两个部分,第一个部分是关键点提取,第二个部分是关键点信息描述,本文仅涉及第一个部分。

      在文章开始之前,有非常重要的一点要说明,点云中任意一点,都有一定概率作为关键点。关键点也是来自原始点云中的一个元素。和图像的边缘提取或者关键点检测算法追求n次插值,最终求的亚像素坐标不同,点云的关键点只在乎找到那个点。

    1. 边缘提取

      首先声明本文所有思想算法公式均来自:Point Feature Extraction on 3D Range Scans Taking into Account Object Boundaries 

      在正式开始关键点提取之前,有必要先进行边缘提取。原因是相对于其他点,边缘上的点更有可能是关键点。和图像的边缘不同(灰度明显变化),点云的边缘有更明确的物理意义。对点云而言,场景的边缘代表前景物体和背景物体的分界线。所以,点云的边缘又分为三种:前景边缘,背景边缘,阴影边缘。

      rangeImage 是一个天然适合用于边缘提取的框架。在这里需要做一些假设:每个rangeImage像素中假设都只有一个点(显然在生成rangeImage的时候点云是被压缩了的,压缩了多少和rangeImage的分辨率有关,分辨率不能太小,否则rangeImage上会有"洞”,分辨率太大则丢失很多信息)。

      三维点云的边缘有个很重要的特征,就是点a 和点b 如果在 rangImage 上是相邻的,然而在三维距离上却很远,那么多半这里就有边缘。由于三维点云的规模和稀疏性,“很远”这个概念很难描述清楚。到底多远算远?这里引入一个横向的比较是合适的。这种比较方法可以自适应点云的稀疏性。所谓的横向比较就是和 某点周围的点相比较。 这个周围有多大?不管多大,反正就是在某点pi的rangeImage 上取一个方窗。假设像素边长为s. 那么一共就取了s^2个点。接下来分三种情况来讨论所谓的边缘:

      1.这个点在某个平面上,边长为 s 的方窗没有涉及到边缘

      2.这个点恰好在某条边缘上,边长 s 的方窗一半在边缘左边,一半在右边

      3.这个点恰好处于某个角点上,边长 s 的方窗可能只有 1/4 与 pi 处于同一个平面

      如果将 pi 与不同点距离进行排序,得到一系列的距离,d0 表示与 pi 距离最近的点,显然是 pi 自己。 ds^2 是与pi 最远的点,这就有可能是跨越边缘的点了。 选择一个dm,作为与m同平面,但距离最远的点。也就是说,如果d0~ds^2是一个连续递增的数列,那么dm可以取平均值。如果这个数列存在某个阶跃跳动(可能会形成类似阶跃信号)那么则发生阶跃的地方应该是有边缘存在,不妨取阶跃点为dm(距离较小的按个阶跃点)原文并未如此表述此段落,原文取s=5, m=9 作为m点的一个合理估计。

      对任意一个点,进行打分,来判断该点作为边缘点有多大可能性。首先,边缘可能会在某点的:上,下,左,右四个方向。

      所以只要把pi 和 pi 右边的点求相对距离。 并把这个相对距离和dm进行比较,就可以判断边缘是不是在该点右边。如果距离远大于dm,显然该点右边的邻点就和pi不是同一个平面了。

      

      为了增加对噪声的适应能力,取右边的点为右边几个点的平均数。接下来依据此信息对该点进行打分。

      其中deta 就是dm. dright = || pi pright ||. 

      最后再取大于0.8的Sright,并进行非极大值抑制。就可以得到物体的边缘了

      

    2. 关键点提取

        在提取关键点时,边缘应该作为一个重要的参考依据。但一定不是唯一的依据。对于某个物体来说关键点应该是表达了某些特征的点,而不仅仅是边缘点。所以在设计关键点提取算法时,需要考虑到以下一些因素:

      i) it must take information about borders and the surface structure into account;

       边缘和曲面结构都要考虑进去

         ii) it must select positions that can be reliably detected even if the object is observed from another perspective;

           关键点要能重复

      iii) the points must be on positions that provide stable areas for normal estimation or the descriptor calculation in general.

       关键点最好落在比较稳定的区域,方便提取法线 

      对于点云构成的曲面而言,某处的曲率无疑是一个非常重要的结构描述因素。某点的曲率越大,则该点处曲面变化越剧烈。在2D rangeImage 上,去 pi 点及其周边与之距离小于2deta的点,进行PCA主成分分析。可以得到一个 主方向v,以及曲率值 lamda. 注意, v 必然是一个三维向量。

      那么对于边缘点,可以取其 权重 w 为1 , v 为边缘方向。

      对于其他点,取权重 w 为 1-(1-lamda)^3 , 方向为 v 在平面 p上的投影。 平面 p 垂直于 pi 与原点连线。

      到此位置,每个点都有了两个量,一个权重,一个方向。

      将权重与方向带入下列式子 I 就是某点 为特征点的可能性。

      最后进行极大值抑制,就可以得到一些特征点了。

    Harris3D

    除去NARF这种和特征检测联系比较紧密的方法外,一般来说特征检测都会对曲率变化比较剧烈的点更敏感。Harris算法是图像检测识别算法中非常重要的一个算法,其对物体姿态变化鲁棒性好,对旋转不敏感,可以很好的检测出物体的角点。甚至对于标定算法而言,HARRIS角点检测是使之能成功进行的基础。

    1.Harris 算法 

      其思想及数学推导大致如下:

      1.在图像中取一个窗 w

      2.获得在该窗下的灰度  I

      3.移动该窗,则灰度会发生变化,平坦区域灰度变化不大,边缘区域沿边缘方向灰度变化剧烈,角点处各个方向灰度变化均剧烈

      4.依据3中条件选出角点

      当然啦,如果Harris算子的实现也和它的思想这么平淡那我就不表扬他聪明了,Harris算子的具体实现方法,利用的是图像偏微分方程的思想。

      先给出抽象数学表达式:

      其中 w 代表窗函数,某个x,y为图像坐标,u,v是一个移动向量(既反应移动方向,也反应移动大小)。

     

      Ix表示图像沿x方向的差分,Iy表示图像沿y方向的差分。

      

      显然,E(u,v)可以用另外一种形式来表示了。最终可以表达为协方差矩阵的形式。

      OK,在这里我们有了数学中最优雅的表达——Matrix,especially symmetric Matrix. Nothing is better than that.

      

    2.矩阵的方向性

      显然,E(u,v)的值和u,v有关。。。很有关。。

      1.可以取一组u,v,让E(u,v)的值最小。

      2.还可以取一组u,v,让E(u,v)的值最大。

      这些u,v怎么取,显然就和矩阵M的方向有关。

      平面内的一个矩阵乘以一个向量v,大概简单的写成   Mv

      它会使得这个向量发生一个作用:旋转,拉伸,平移.....总之,这种作用叫做  线性变换

      矩阵的左边好像也是一个向量,只不过是横着写的([u v]),换而言之,那就是 vT(v的转置)。

      vT(Mv)......这是啥?

      意思好像是。。。。v先旋转+拉伸一下,然后再在它自己身上投影,最终的 E(u,v)本质上来说,就是这个投影的长度。。。嗯,对,投影的长度

      好了。我们现在明确了 E(u,v) 的数学几何意义,再回过头来想想,要怎样才能让这个投影的长度达到最大或者最小呢?

      显然,答案就是矩阵的特征值特征向量,当[u v]T 取特征向量方向的时候,矩阵M只有拉伸作用,而没有旋转作用,这时的投影长度是最长的(如果反向投则是负的最长)。

      到此为止,我们已经知道了 E(u,v)的最大和最小值了(笨办法是求出特征向量方向再带进去,聪明的方法是直接看矩阵特征值,特征值就是放大倍数)。并且,分析可以知道,特征值越大,那么说明 E(u,v)越大。

      1.两个特征值都很大==========>角点(两个响应方向)

      2.一个特征值很大,一个很小=====>边缘(只有一个响应方向)

      3.两个特征值都小============>平原地区(响应都很微弱)

      基于上述特征,有很多人设计了角点的快速判据。

      有 det(M) - trace(M)^2

      有 det(M)/trace(M)

      .....等等很多,但是这不重要,思想都是一样的。

    3. 3DHarris 

      在2DHarris里,我们使用了 图像梯度构成的 协方差矩阵。 图像梯度。。。嗯。。。。每个像素点都有一个梯度,在一阶信息量的情况下描述了两个相邻像素的关系。显然这个思想可以轻易的移植到点云上来。

      OOPS,糟糕,点云木有灰度的概念啊,一般的点云也木有强度的概念啊。。。这可如何是好??????

      别紧张,pcl 说这样能行,那就肯定能行咯,先定性的分析一下Harris3D的理念。

      想象一下,如果在 点云中存在一点p

      1、在p上建立一个局部坐标系:z方向是法线方向,x,y方向和z垂直。

      2、在p上建立一个小正方体,不要太大,大概像材料力学分析应力那种就行

      3、假设点云的密度是相同的,点云是一层蒙皮,不是实心的。

        a、如果小正方体沿z方向移动,那小正方体里的点云数量应该不变

        b、如果小正方体位于边缘上,则沿边缘移动,点云数量几乎不变,沿垂直边缘方向移动,点云数量改变

        c、如果小正方体位于角点上,则有两个方向都会大幅改变点云数量

      OK,我们已经有了Harris3D的基本准则,接下来要思考的是怎样优雅的解决这个问题

      两个和z相互垂直的方向。。。。嗯。。。。perpendicular。。。。

      如果由法向量x,y,z构成协方差矩阵,那么它应该是一个对称矩阵。而且特征向量有一个方向是法线方向,另外两个方向和法线垂直。

      那么直接用协方差矩阵替换掉图像里的M矩阵,就得到了点云的Harris算法。

      其中,半径r可以用来控制角点的规模

      r小,则对应的角点越尖锐(对噪声更敏感)
      r大,则可能在平缓的区域也检测出角点

     4.PCL对Harris算法的实现

      根据以上分析,在PCL的API文档的帮助下,我尝试了一下 Harris3D 算法。感谢山大的毕同学提供的点云,该点云是场景点云而不是一般的物体点云。总体感觉是慢,因为针对每个点云,需要计算它的法线,算完之后又要针对每个点进行协方差矩阵的计算,总而言之,整个过程还是非常耗时的。并且说实话。。。算法的效果一般般。

    复制代码
    #include <iostream>
    #include <pcl\io\pcd_io.h>
    #include <pcl/point_cloud.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <pcl/io/io.h>
    #include <pcl/keypoints/harris_keypoint3D.h>
    #include <cstdlib>
    #include <vector>
    using namespace std;
    
    
    
    int
    main()
    {
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
        pcl::io::loadPCDFile ("F:\\PCL\\PCD\\both.pcd", *cloud);
        boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer);
        viewer->addPointCloud(cloud,"all_cloud");
            //注意Harris的输出点云必须是有强度(I)信息的,因为评估值保存在I分量里
        pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_out (new pcl::PointCloud<pcl::PointXYZI>);
        pcl::HarrisKeypoint3D<pcl::PointXYZ,pcl::PointXYZI,pcl::Normal> harris;
        harris.setInputCloud(cloud);
        cout<<"input successful"<<endl;
        harris.setNonMaxSupression(true);
        harris.setRadius(0.04f);
        harris.setThreshold(0.02f);
        cout<<"parameter set successful"<<endl;
            //新建的点云必须初始化,清零,否则指针会越界
        cloud_out->height=1;
        cloud_out->width =100;
        cloud_out->resize(cloud_out->height*cloud->width);    
            cloud_out->clear();
        harris.compute(*cloud_out);
        int size = cloud_out->size();
    
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_harris (new pcl::PointCloud<pcl::PointXYZ>);
        cloud_harris->height=1;
        cloud_harris->width =100;
        cloud_harris->resize(cloud_out->height*cloud->width);
        cloud_harris->clear();
    
        pcl::PointXYZ point;
            //可视化结果不支持XYZI格式点云,所有又要导回XYZ格式。。。。
        for (int i = 0;i<size;i++)
        {    
            point.x = cloud_out->at(i).x;
            point.y = cloud_out->at(i).y;
            point.z = cloud_out->at(i).z;
            cloud_harris->push_back(point);
        }
    
    
    
        pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> harris_color_handler (cloud_harris, 0, 255, 0);
        viewer->addPointCloud(cloud_harris,harris_color_handler,"harris");
        viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "harris");
    
    
    
    
        while (!viewer->wasStopped())
        {
            viewer->spinOnce(100);
    
        }
        
            system("pause");
    }    
    复制代码

      由于我选择的搜索半径比较大,所以找到的角点都不是太"角”,关于参数设置大家可以多多探索,但我认为,特征点检测算法实在太慢,对实时机器人系统来说是远远达不到要求的。这种先算法线,再算协方差的形式真心上不起。。。。实际上这种基于领域法线的特征点检测算法有点类似基于 CRF的语义识别算法,都只使用了相邻信息而忽略了全局信息。也可能相邻信息包含的相关性比较大,是通往高层次感知的唯一路径吧,谁又知道呢?

    ISS&Trajkovic

    关键点检测往往需要和特征提取联合在一起,关键点检测的一个重要性质就是旋转不变性,也就是说,物体旋转后还能够检测出对应的关键点。不过说实话我觉的这个要求对机器人视觉来说是比较鸡肋的。因为机器人采集到的三维点云并不是一个完整的物体,没哪个相机有透视功能。机器人采集到的点云也只是一层薄薄的蒙皮。所谓的特征点又往往在变化剧烈的曲面区域,那么从不同的视角来看,变化剧烈的曲面区域很难提取到同样的关键点。想象一下一个人的面部,正面的时候鼻尖可以作为关键点,但是侧面的时候呢?会有一部分面部在阴影中,模型和之前可能就完全不一样了。

      也就是说现在这些关键点检测算法针对场景中较远的物体,也就是物体旋转带来的影响被距离减弱的情况下,是好用的。一旦距离近了,旋转往往造成捕获的仅有模型的侧面,关键点检测算法就有可能失效。

    1.ISS算法

      ISS算法的全程是Intrinsic Shape Signatures,第一个词叫做内部,这个词挺有讲究。说内部,那必然要有个范围,具体是什么东西的范围还暂定。如果说要描述一个点周围的局部特征,而且这个物体在全局坐标下还可能移动,那么有一个好方法就是在这个点周围建立一个局部坐标。只要保证这个局部坐标系也随着物体旋转就好。

      方法1.基于协方差矩阵

      协方差矩阵的思想其实很简单,实际上它是一种耦合,把两个步骤耦合在了一起

        1.把pi和周围点pj的坐标相减:本质上这生成了许多从pi->pj的向量,理想情况下pi的法线应该是垂直于这些向量的

        2.利用奇异值分解求这些向量的0空间,拟合出一个尽可能垂直的向量,作为法线的估计

      协方差矩阵本质是啥?就是奇异值分解中的一个步骤。。。。奇异值分解是需要矩阵乘以自身的转置从而得到对称矩阵的。

      当然,用协方差计算的好处是可以给不同距离的点附上不同的权重。

      方法2.基于齐次坐标

        1.把点的坐标转为齐次坐标

        2.对其次坐标进行奇异值分解

        3.最小奇异值对应的向量就是拟合平面的方程

        4.方程的系数就是法线的方向。

      显然,这种方法更加简单粗暴,省去了权重的概念,但是换来了运算速度,不需要反复做减法。其实本来也不需要反复做减法,做一个点之间向量的检索表就好。。。

      但是我要声明PCL的实现是利用反复减法的。

      不管使用了哪种方法,都会有三个相互垂直的向量,一个是法线方向,另外两个方向与之构成了在某点的局部坐标系。在此局部坐标系内进行建模,就可以达到点云特征旋转不变的目的了。

      ISS特征点检测的思想也甚是简单:

      1.利用方法1建立模型

      2.其利用特征值之间关系来形容该点的特征程度。

      显然这种情况下的特征值是有几何意义的,特征值的大小实际上是椭球轴的长度。椭球的的形态则是对邻近点分布状态的抽象总结。试想,如果临近点沿某个方向分布致密则该方向会作为椭球的第一主方向,稀疏的方向则是第二主方向,法线方向当然是极度稀疏(只有一层),那么则作为第三主方向。

      如果某个点恰好处于角点,则第一主特征值,第二主特征值,第三主特征值大小相差不会太大。

      如果点云沿着某方向致密,而垂直方向系数则有可能是边界。

      总而言之,这种局部坐标系建模分析的方法是基于特征值分析的特征点提取。

      最后补充,Intrisic指的就是这个椭球的内部

    PCL实现

    复制代码
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr model (new pcl::PointCloud<pcl::PointXYZRGBA> ());;
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr model_keypoints (new pcl::PointCloud<pcl::PointXYZRGBA> ());
    pcl::search::KdTree<pcl::PointXYZRGBA>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGBA> ());
    // Fill in the model cloud
    double model_resolution;
    // Compute model_resolution
    pcl::ISSKeypoint3D<pcl::PointXYZRGBA, pcl::PointXYZRGBA> iss_detector;
    iss_detector.setSearchMethod (tree);
    iss_detector.setSalientRadius (6 * model_resolution);
    iss_detector.setNonMaxRadius (4 * model_resolution);
    iss_detector.setThreshold21 (0.975);
    iss_detector.setThreshold32 (0.975);
    iss_detector.setMinNeighbors (5);
    iss_detector.setNumberOfThreads (4);
    iss_detector.setInputCloud (model);
    iss_detector.compute (*model_keypoints);
    复制代码

    2.Trajkovic关键点检测算法

      角点的一个重要特征就是法线方向和周围的点存在不同,而本算法的思想就是和相邻点的法线方向进行对比,判定法线方向差异的阈值,最终决定某点是否是角点。并且需要注意的是,本方法所针对的点云应该只是有序点云。

      本方法的优点是快,缺点是对噪声敏感。

    另外,在二维图像中的BRISK描述子,AGAST描述子,SIFT特征,SUAN特征,都 已经移植为对应的3D特征。这里不再啰嗦。

    展开全文
  • 投影与三视觉

    千次阅读 2016-12-08 14:54:08
    对极几何 五 本征矩阵和基础矩阵   5.1**极线的计算** 六 立体标定 七 立体校正 八 校正映射 九 立体匹配 十 从三重投影获得深度映射 投影与三视觉    一般情况下,没有可靠的方法可以做到不...

    投影与三维视觉

       一般情况下,没有可靠的方法可以做到不依赖多幅图像就可以进行标定或提取3D信息。利用多幅图像重建三维场景的最常见情形就是立体视觉。在立体视觉中,同时在不同位置上拍摄两幅图像(或者更多)中的特征,然后对图像中的相应特征进行匹配,分析其中的差异,从而获得深度信息。
       另一个情形是从运动中得到结构。这种情况下,我们可能只用一个摄像机,但是要在不同时间从不同的地方拍摄多幅图像。对前者而言,我们主要对视差效应(三角部分)感兴趣,并作为计算距离的一种方法;而后者,则是通过计算基础矩阵(将两个不同场景联系到一起)来获得场景理解的数据源。

    投影

       一旦对摄像机完成了标定(见我的上一篇博客《摄像机模型与标定》),就有能将现实物理世界中的点无歧义地投影到图像上。这意味着给定对于摄像机三维物理坐标框架下的位置,我们就可以计算该三维点在成像仪中的坐标,即像素坐标。在OpenCV中,这个转换过程通过函数cvProjectPoints2()来实现的。
       可以通过如下案列来更好地理解该函数的用法(在高版本的OpenCV中函数名变为了projcetPoints()):

    void project2Ellipse(double &radius, double &Rx, double &Ry, double &Rz, double &Tz, int &sigma, vector<Point2f> &imgCenter, Mat &img)
    {
        /STEP-1:设定相机模型
        vector<Point2f>  in_pnts;
        vector<Point3f>  out_pnts;
        static vector<Point2f>  boundaryPnts;
        /STEP-1.1:设定相机内参数;
        double fx = 5769.518128499;
        double fy = 5769.304247163;
        /*double cx = 2575.315753418;
        double cy = 1695.067332223;*/
        double cx = 335;
        double cy = 255;
        Mat Camera_Matrix = (Mat_<double>(3, 3) << fx, 0, cx, 0, fy, cy, 0, 0, 1);
        /STEP-1.2:设定相机畸变参数
        /*double k1 = -0.124141797;
        double k2 = 0.197321413;
        double k3 = -0.000768697;
        double k4 = -0.001034843;*/
        double k1 = 0;
        double k2 = 0;
        double k3 = 0;
        double k4 = 0;
        vector<double> Distort_Coefficients;
        Distort_Coefficients.push_back(k1);
        Distort_Coefficients.push_back(k2);
        Distort_Coefficients.push_back(k3);
        Distort_Coefficients.push_back(k4);
        /STEP-1.3:设定相机外参数:R,T(旋转、平移)
        //double Tx = -189.425316;
        //double Ty = -156.421414;
        double Tx = 0;
        double Ty = 0;
        Mat NewProMatrix = (Mat_<double>(3, 1) << Tx, Ty, Tz);
        Mat RectTransformation = (Mat_<double>(3, 1) << Rx, Ry, Rz);
        /STEP-1.4:设定图像大小
        int length = 3456;
        int width = 5184;
        Mat srcImg = Mat::Mat(length, width, CV_8UC1, Scalar(0)) + 50;
    
        /STEP-2:使用 projectPoints 把理论圆心点影射到图像上,计算得到椭圆上的理论圆心。
        Mat _RectTransformation;
        RectTransformation.copyTo(_RectTransformation);
        if (RectTransformation.cols == 1 || RectTransformation.rows == 1)
        {
            Rodrigues(RectTransformation, _RectTransformation);
        }
        Point3f centerPnt = Point3f(0, 0, 0);
        vector<Point3f> centerPoint;
        centerPoint.push_back(centerPnt);
        projectPoints(centerPoint, _RectTransformation, NewProMatrix,
            Camera_Matrix, Distort_Coefficients, imgCenter);
        STEP-1.5:遍历图像中的每一个像素
    
        for (int i = 0; i < srcImg.rows; i++)
        {
            for (int k = 0; k < srcImg.cols; k++)
            {
                in_pnts.push_back(Point2f(k, i));
            }
        }
        /STEP-3:使用函数project2CalibrationBoard将图像的任意一个像素影射到标定板上
        CoreAlgorithm::project2CalibrationBoard(in_pnts, out_pnts,
            Camera_Matrix, Distort_Coefficients, RectTransformation, NewProMatrix);
        /STEP-4:根据标定板上的理论圆,计算该影射点是否在该圆内。  
        /若在,则为白色,否则为黑色。  采用到原点距离的方法设定,严格小于设定方法
        for (int i = 0; i < out_pnts.size(); i++)
        {
            double Dis = sqrt(pow((out_pnts[i].x - centerPnt.x), 2) + pow((out_pnts[i].y - centerPnt.y), 2) + pow((out_pnts[i].z - centerPnt.z), 2));
            if (Dis <= radius)
            {
                srcImg.at<uchar>(in_pnts[i].y, in_pnts[i].x) = 200;
            }
            else
            {
                srcImg.at<uchar>(in_pnts[i].y, in_pnts[i].x) = 50;
            }
        }
    }
    

       注:上面的代码可以 参考我之前的一篇名为:《罗德里格斯》的博文,以便更好地理解其含义。

    二 仿射变换和透视变换

       仿射变换可以将矩形映射为任意平行四边形;而更一般的情形是,透视变换将矩形映射为任意四边形。

       透视变换与透视投影关系密切。透视投影是使用中心投影法,沿着一系列最终汇聚到一个被称为投影中心的点的投影线,将三维物理世界中的点投影变换到二维图像平面中。

    2.1 POSIT:3D姿态估计

       在进入立体视觉之前,我们首先了解一下一个能够估计已知物体三维位置的算法,即POSIT算法。POSIT(英文“Pose from Orthography and Scaling with iteration”的缩写)是1992年首次提出的用于计算3D物体(其精确的维数是已知的)的姿态的一种算法(位置T和方向R由6个参数描述)。为了计算这个姿态,必须找到物体表面的至少4个非共面点在相应二维图像上的位置。
        由正交投影和尺寸变换提取姿态(POS),并假设物体上的点具有相同的有效深度而且原始模型的大小变化只与其距摄像机的远近比例相关。在这种情况下,基于尺度变换的物体三维姿态的解是闭合式的。所有物体点都具有相同有效深度的假设意味着物体距离摄像机足够远,使得我们可以忽略了各个点在物体内部的深度差异,这个假设称为”弱透视近似”。

    2.2 立体成像

       在实际应用中,两台摄像机的立体成像过程包括以下四个步骤。

       1)消除畸变:使用数学方法消除径向和切线方向上的镜头畸变,在这一步输出的是无畸变图像。
       2)摄像机校正:调整摄像机间的角度和距离,输出行对准的校正图像。
       3)图像匹配:查找左右摄像机视场中的相同特征。这一步输出的是视差图,差值是指左右图像上的相同特征在x坐标上的差值x1-Xr。
       4)重投影:当知道了摄像机的相对几何位置后,就可以将视差图通过三角测量的方法转成距离。本步骤输出等深度图。
    我们先从最后一步说起,然后分析前三步。

    三 三角测量

       假设我们已有一套无畸变、对准、已测量好的完美标准立体实验台,如图所示:

    这里写图片描述

       两台摄像机的像平面精确位于同一平面上,光轴严格平行(光轴是从投影中心o朝向主点c方向引出的一条射线,也称为主光线),距离一定,焦距相同fl=fr。并且假设主点
    Cx和Cy已经校准,在左右图像上具有相同的像素坐标。
    注意:
        不要将主点和图像中心混为一谈,主点是主光线与像平面的交点,该交点在镜头的光轴上。像平面很少与镜头完美地重叠,因此图像中心也几乎不会和像主点重合。

       进一步假设两幅图像是行对准的,并且一台摄像机的像素行与另一台完全对准,我们称为摄像机前向平行排列。再假设物理世界中的点P在左右图像上的成像点为Pl
    和Pr,相应的横坐标分别为xl和xr。

       在这个简单化的例子中,xl和xr分别表示点在左右成像仪上的水平位置,这使得深度与视差成反比例关系,视差简单的定义为

    d=xlxrd=xl−xr

       如图12-4所示,利用相似三角形可以很容易推导出Z值。由图可知:
    T(xlxr)Zf=TZZ=fTxlxrT−(xl−xr)Z−f=TZ⇒Z=fTxl−xr

       因为深度与视差成反比,二者有明显的非线性关系。
    这里写图片描述
       当视差接近于0时,微小的视差变化会导致很大的深度变化;当视差较大时,微小的视差变化几乎不会引起深度多大的改变。结果就是,立体视觉系统仅仅对于物体与摄像机相距较近时具有较高的深度精度。

       现在我们必须花一些精力去弄明白,怎么样才能现实世界中摄像机设备映射到理想安排的几何状态。在真实世界中,摄像机几乎不可能会像图12-4那样的严格的前向平行对准。不过,我们可以通过数学的方法计算投影图和畸变图,从而将左右图像校正成为前向平行对准。在设计立体实验台的时候,最好近似地将摄像机放置成前向对准,并尽量让摄像机水平对准。
    这里写图片描述

    这里写图片描述

    四 对极几何

    这里写图片描述

       立体成像的基本几何学就是对极几何。从本质上来说,对极几何就是将两个针孔模型(每个摄像机就是一个针孔)和一些新的被称为极点的感兴趣点结合起来。

       我们总结一下立体摄像机对极几何的一些事实。

    • 摄像机视图内的每个3D点都包含在极面内,极面与每幅图像相交的直线是极线。

    • 给定一幅图像上的一个特征,它在另一幅图像上的匹配视图一定在对应的极线上。这就是”对极约束”.

    • 对极约束意味着,一旦我们知道立体试验台的对极几何之后,对两幅图像间匹配特征的二维搜索就转变成了沿着极线的一维搜索。这不仅仅节省了大量的计算,还允许我们排除许多导致虚假匹配的点。

    • 次序是保留的。如果两个点A和B在两幅成像仪上都可见,按顺序水平出现在其中成像仪上,那么在另一个成像仪上也是水平出现。

    五 本征矩阵和基础矩阵

       你可能急着想知道计算极线的OpenCV函数了。但在介绍这些函数之前,我们实际上还需要两个因素。这两个因素就是本征矩阵E和基础矩阵F矩阵E包含在物理空间中两个摄像机相关的旋转和平移信息,矩阵F除了包含E的信息外还包含了两个摄像机的内参数。由于F包含了这些内参数,因此它可以在像素坐标系将两台摄像机关联起来。
    这里写图片描述
       我们再补充一下E和F的区别:
    1)本征矩阵E联系的是物理坐标系下的点;
    2)基础矩阵F联系的是像平面上的点。

      5.1**极线的计算**

      一旦有了基础矩阵,我们就能够计算极线。OpenCV中cvComputeCorrespondEpilines()函数根据一幅图像中的点列,计算其在另一幅图像中对应的极线。注意,给定一幅图像上的任意一点,在另外一幅图像上总有对应的极线。每条计算的极线以三点(a,b,c)的形式编码,这样极线就定义如下:

    ax+by+c=0ax+by+c=0

       为了算出这些极线,函数需要前面用cvFindFundamentalMat()算出的基础矩阵。

    六 立体标定

       立体标定是计算空间上两台摄像机几何关系的过程。相反地,立体校正则是对个体图像进行纠正的过程,这样保证这些图像可以从像平面行对准的两幅图像获得。通过这样的校正,两台摄像机的光轴(或者主光线)就是平行的,即所谓无穷远处相交。

    七 立体校正

       当两个像平面是完全的行对准时(见图12-4),计算立体视差是最简单的。不幸的是,如前面所讨论的,由于两台摄像机几乎不可能有准确的共面和行对准的成像平面,完美的对准结构在真实的立体系统中几乎不存在。图12-7显示了立体校正的目的:我们要对两台摄像机的图像平面重投影,使得它们精确落在同一个平面上,而且图像的行完全地对准到前向平行的结构上。如何选择特定的平面使摄像机保持数学对准依赖于所使用的算法。

       有很多算法可以计算我们的校正项,OpenCV实现了其中的两种:一是Hartley算法,它只使用基础矩阵来生成非标定立体视觉;二是Bouguet算法,它使用两台标定摄像机的旋转和平移参数。

    八 校正映射

    这里写图片描述
       一旦有了立体标定项,我们就可以单独调用cvInitUndistortRectifyMap()来事先计算左右视图的校正查找映射表。对任何图像到图像的映射函数,由于目标位置是浮点型的缘故,正向映射(即根据原始图像上的点计算其到目标图像上的点),不会命中目标图像对应的像素位置,因为目标图像看起来像瑞士硬干酪。因此我们采用逆向映射。

       这个校正的过程如图12-11所示。图中公式流程图就是真实的从(c)到(a)的向后校正过程,称为逆向映射。

    九 立体匹配

       立体匹配——匹配两个不同的摄像机视图的3D点——只有在两摄像机的重叠视图内的可视区域上才能被计算。再重复一下,这就是为什么如果将摄像机尽量靠近前向平行以获得更好结果的一个原因。

    对于处理非畸变的校正立体图像,块匹配立体匹配算法有以下三个步骤。
       1)预过滤,使图像亮度归一化并加强图像纹理。
       2)沿着水平线用SAD窗口进行匹配搜索。
       3)再过滤,去除坏的匹配点。

       注意:视差越大,表示距离越近。
    这里写图片描述
    这里写图片描述

    十 从三维重投影获得深度映射

       OpenCV中有两个函数帮助我们完成这项工作。第一个函数是:cvPerspectiveTransform();
    第二个函数(也是新函数)cvReprojectImageTo3D()是操作整幅图像。

      个人公众号:

    这里写图片描述

    展开全文
  • 本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  文章链接: http://blog.csdn.net/zhmxy555/article/details/8685546 作者:毛星云(浅墨) 邮箱: happylifemxy@163.com这篇...用一个C++类把这种三天空
  • 用JDBC+GUI的一个简单的学生管理系统

    千次阅读 多人点赞 2018-04-17 20:14:46
    刚学完JDBC不久,了一个简单的学生管理系统,可能还有不完善的地方,望各路大神见谅。废话不多说,我先贴个图让大家让大家瞅瞅,觉得是你想的再看下去吧。我是以管理者的身份去的,适合初学者去学习。在之前...
  • 超硬核!操作系统学霸笔记,考试复习面试全靠它

    万次阅读 多人点赞 2021-03-22 18:43:49
    1)根据终止的进程的标识符,搜索出该进程的PCB,从中获得该进程所处的状态 2)如果该进程正处于执行状态,立刻终止该进程,并且置调度标志为真,表示在该进程结束后应该进行重新调度(即不要让CPU空闲) ...
  • 这两者天生就是一对好搭档,我们可以把它们看做光照计算的两要素,想绘制出具有光照的真实三世界,两者缺一不可。 下面就开始正式讲解,首先我们来看看四大光照类型:     二、四大光照类型 1.环境光(Ambient...
  • 系统学习机器学习之神经网络() --SOM

    万次阅读 多人点赞 2016-12-05 10:29:28
    中不仅获胜神经元本身调整权向量,它周围的神经元在其影响下也程度不同地调整权向量。这种调整可用三种函数表示,下图的bcd。 Kohonen算法:基本思想是获胜神经元对其邻近神经元的影响是由近及远,对附近...
  • 与统计机器学习的精密思维相比,传统的机器学习基本上属于摸着石头过河,用传统的机器学习方法构造分类系统完全成了一种技巧,一个人的结果可能很好,另一个人差不多的方法出来却很差,缺乏指导和原则。...
  • ——一个支持图形界面的操作系统(下) Version 0.01 ( 对应 pyos 版本 2004_10_06_15_00 )   哈尔滨工业大学 谢煜波 ( email:xieyubo@gmail.com )   前言 在上篇中,我们已经了解了怎样显示一个
  • C语言指针重点难点整理(详解)(包括一数组,二数组的元素指针,二数组的行指针函数参数,指针数组,行指针数组) 笔者学指针之前: 呵呵,听闻指针是C语言的难点,我倒见识一下,到底有多难 笔者学完...
  • 在我们的计算机三世界中,想模拟出真实而复杂的三物体,让他们从表面上看起来逼真,就需要请出“纹理映射”这套技术。   二、纹理映射的概念   一言以蔽之,纹理映射是一种将2D图像映射到3D物体上的技术。 ...
  • 【Visual C++】游戏开发笔记十一 浅墨DirectX教程之九 为三世界添彩:纹理映射技术(一) 》中讲过的知识点。 纹理是所有游戏中永恒的核心部分,无论是2D还是3D游戏。一言以蔽之,纹理映射是一种将2D图像映射到3D...
  • 随着越来越多的数据和应用和地理空间相关,空间索引变得愈加重要。然而,有效地查询地理空间数据是相当大的挑战,因为...在这篇博文中,我将介绍几种:叉树,geohash(不要和geohashing混淆)以及空间填充曲
  • 象限分析法又称波士顿矩阵,使用二维四象限对两个维度的变量进行分析,个象限代表不同的战略,根据战略不同用于进行不同的决策。决策有两类象限分析法被单独作为分析法使用:...
  • 我们只是在windows窗口中画了一个三角形而已,而这个用GDI是很容易做到的,现在我么那要做的就是怎么样画出一个物体来让他看起来比较三化,而这些,很容易在我们已有的程序中进行改进而得到。如果你还记得,在早些...
  • 双目视觉三重建框架

    万次阅读 多人点赞 2018-01-23 14:08:52
    玉米竭力用轻松具体的描述来讲述双目三重建中的一些数学问题。希望这样的方式让大家以一个轻松的心态阅读玉米的《计算机视觉学习笔记》双目视觉数学架构系列博客。这个系列博客旨在捋顺一下已标定的双目视觉中的...
  • 试述数据、数据库、数据库系统、数据库管理系统的概念。 答:  ( l )数据( Data ) :描述事物的符号记录称为数据。数据的种类有数字、文字、图形、图像、声音、正文等。数据与其语义是不可分的。解析在...
  • 《规程)中指出地面三激光扫描总体工作流程应包括技术准备与技术设计、控制测量、数据采集、数据预处理、成果制作、质量控制与成果归档。本章首先闸述制定扫描方案的方法,然后介绍外业扫描的步骤,最后对点云数据...
  • 多种嵌入式文件系统移植集合

    万次阅读 2013-06-01 21:23:34
    1. 嵌入式存储系统 1.1. 计算机组成原理 从冯.诺依曼的存储程序工作原理及计算机的组成来说,计算机由运算器、控制器、存储器和输入/输出设备五大部件组成。其中运算器和控制器统称为中央处理器(CPU),而存储系统...
  • 任意多边形三屋顶自动生成算法

    千次阅读 2015-01-13 17:19:00
    第一篇,写一下今年10月份的一个三屋顶算法。这个算法是为三GIS根据地图数据自动构建建筑物的预研项目基础的。当时自己遇到许多难题,最近写一些算法文档,顺便就贴出来,相互讨论学习一下。这个算法中...
  • 业务身份识别在我们的应用中非常重要,因为我们的CRM系统要服务不同的业务方,而且每个业务方又有多个租户。比如中供销售,中供拍档,中供商家都是不同的业务方,而拍档下的每个公司,中供商家下的每个供应商又是...
  • 推荐系统召回模型之全能的FM模型

    千次阅读 多人点赞 2019-03-06 16:35:37
    就是说靠一个模型一个阶段把传统的两阶段推荐系统做的事情一步到位完?如果不能,为什么不能?如果能,怎么才可以?什么样的模型才能担当起这种重任呢?而在现实世界里是否存在这个模型?这个思路真的可行吗? ...
  • 校园三可视化建模与仿真

    千次阅读 2015-05-22 09:21:54
    现在把2012年时,指导几个学生的校园三建模的东西和大家分享。 模型主要是由学生建立的,耗费了三个月的时间,软件是我用VP二次开发的,用了不到1个月的时间。由于这个项目只是为了培养学生,因此各方面都没有...
  • 上一节对数据库的知识了一个小总结,实际找工作过程中,因为公司或单位侧重点不一样,考察的知识也是不尽相同的,但是作为计算机类的学生,操作系统的知识也是必不可少的,去年参加笔试面试的时候,腾讯微软阿里等...
  • 》、《编写操作系统之键盘交互的实现》、《一个支持图形界面的操作系统(上)》这几篇实验报告中所描述的内容。因此,如果你想更好的理解本实验的内容,可以在纯 C 论坛上找到上面几篇实验报告进行参考,本篇实验...
  • 数字栅格地图矢量化及三显示教程

    万次阅读 多人点赞 2018-04-22 14:31:19
    对等高线地形图扫描件在ArcMap中依次进行地理配准、地理要素矢量化、拓扑检查、等高线平滑、附高程值、生成TIN、在TIN间拉伸操作,在ArcScene中进行叠加遥感影像、浮动于自定义表面操作,最终得到一幅三地形图。...
  • 如何在C++中动态建立二数组

    千次阅读 2014-05-15 08:36:09
    数组是指针,可将二数组看作是指针的指针:每一行是一个一数组,而列是指向行的指针。在动态创建时,先分配指向行的...//[3]4] //三行列的二数组 int x,y; int i,n,k; x=3; y=4; int **p; p = new
  • 大疆精灵4航测输出正摄影和三模型教程

    万次阅读 多人点赞 2019-03-15 12:04:39
    随便拿台大疆旋翼无人机,配上免费的第三方航线规划软件,再用网上到处能下载的无人机影像处理软件,就能轻松生成正射影像和倾斜三模型。今天以大疆精灵系列无人机为例,主要介绍使用Pix4dCapture和Altizure软件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,456
精华内容 16,182
关键字:

做了系统要不要做四维