精华内容
下载资源
问答
  • 二维表中的行被称为关系
    2022-01-05 09:58:53

    一、关系数据库
    实体间的关系有三种:一对一(one-to-one)、一对多(one-to-many)、多对多(many-to-many)
    (一)数据模型
    1、层次模型(一对多)
    层次模型采用树状结构表示数据之间的联系,树的节点称为记录,记录之间只有简单的层次关系。有且只有一个节点没有父节点,该节点称为根节点;其他节点有且只有一个父节点。
    2、网状模型(多对多)
    可以有任意多个节点没有父节点。一个节点允许有多个父节点。两个节点之间可以有两种或两种以上联系。
    3、关系模型(一对一)
    关系模型用二维表格表示数据及数据联系,是应用最为广泛的数据模型。目前,各种常用的数据库,如Microsoft SQL Server、Microsoft Access、Microsoft FoxPro、Oracle、MySQL、SQLite等,都属于关系模型数据库管理系统。
    4、面向对象模型
    面向对象模型是在面向对象技术基础上发展起来一种的数据模型,它采用面向对象的方法来设计数据库。面向对象模型的数据库种存储对象以对象为单位,每个对象包含对象的属性和方法,具有类和继承等特点。
    (二)关系数据库的概念和特点

    1、基本概念

    (1)关系

    数据和数据之间的联系称为关系。

    (2)二维表

    关系数据库使用二维表来表示和存储关系,一个关系就是一个二维表。表中的行称为记录,列称为字段。一个数据库可以包含多个表。

    (3)记录与字段

    表中的一行称为一个记录。表中的列为记录中的数据项,称为字段。字段也称为属性或者列。每个记录可以包含多个字段,不同记录包含相同的字段(字段的值不同)。例如,用户表中的每个记录包含用户名、登录密码等字段。
    关系数据库不允许在一个表中出现重复的记录。

    (4)关键字

    可以唯一标识一个记录的字段或字段组合称为关键字。一个表可有多个关键字,其中用于标识记录的关键字称为主关键字,其他的关键字可称为候选关键字。一个表只允许有一个主关键字。例如,用户表中的用户名可定义为主关键字,在添加记录时,主关键字不允许重复。

    (5)外部关键字

    如果一个表中的字段或字段组合作为其他表的主关键字,这样的字段或字段组合称为外部关键字。

    2、关系数据库的基本特点

    • 关系数据库中的表是二维表,表中的字段必须是不可再分的,即不允许表中表。
    • 在同一个表中不允许出现重复的记录。
    • 在同一个记录中不允许出现重复的字段。
    • 表中记录先后顺序不影响数据的性质,可以交换记录顺序。
    • 记录中字段的顺序不影响数据,可以交换字段的顺序。

    (三)关系数据库语言SQL

    SQL是Structured Query Language的缩写,即结构化查询语言,它是关系数据库的标准语言。Microsoft SQL Server、Microsoft Access、Microsoft FoxPro、Oracle、MySQL、SQLite等各种关系数据库均支持标准的SQL语言,但各种关系数据库具体在实现SQL时可能有所差别。

    1、创建和删除数据库

    (1)创建数据库:使用create databas

    2)删除数据库:使用drop database语句

    drop database testdb
    
    • 1

    2、创建表

    (1)创建表语句

    • 在数据库中创建表使用create table语句,其基本格式为:create table 数据库名.表名(字段名1 字段数据类型(长度) sql约束,…..)

    • 在指定了“数据库名”时,创建的新表属于指定数据库,否则新表属于当前数据库。

    (2)常用字段数据类型

    数据类型说明
    integer(size)
    int(size)
    smallint(size)
    tinyint(size)
    保存整数,size指定数字的最大位数
    decimal(size, d)
    numeric(size, d)
    保存小数,size指定数字的最大位数,d指定小数的最大位数
    char(size)保存固定长度的字符串(字母、数字以及特殊字符),size指定字符串的长度
    varchar(size)保存可变长度的字符串(字母、数字以及特殊字符),size指定字符串的长度
    date保存日期
    • 最简单的create table命令只指明表名、字段名和数据类型。例如:create table users(name varchar(10), birth date)

    (3)sql约束

    • 用于为表或字段定义约束条件,常用的约束有:NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT(不区分大小写,习惯在SQL语句中将SQL的关键字用大写)。可同时使用为字段定义多个约束。

    3、修改表

    • 修改表使用alter table语句,前面已在修改或删除约束时使用到了该语句。修改表的其他操作通常包括修改表名称、添加字段、修改字段名、修改字段数据类型和删除字段等。

    4、删除表

    • 删除表使用drop table语句:drop table users

    5、删除表中全部记录

    • 删除表中全部记录使用truncate table语句:truncate table users

    6、创建表索引

    • 表索引可以按索引字段对记录进行排序,查询索引字段比非索引字段的速度更快。
    • create index语句用于创建索引。
    create index index_on_name on users(name)
    
    • 1

    7、创建视图

    • 视图是数据库中预定义的查询,创建视图使用create view语句。
    create view user_age as select name, age from users
    
    • 1

    8、执行查询

    • select语句用于执行查询,查询结果存储在一个表中(称为查询结果集)。
    SELECT 输出字段列表
       FROM 表名称
       [GROUP BY 用于分组的字段列表]
       [WHERE 筛选条件表达式]
       [ORDER BY 排序字段列表 [DESC|ASC]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    功能实现
    返回表中的全部字段用星号可表示返回表中的全部字段。select * from users
    返回表中的指定字段在需要返回个别字段时,在输出字段列表中包含这些字段,用逗号分隔。select name, age from users
    为字段指定输出名称默认情况下,查询结果集中字段名与输出字段同名,可以用as为输出字段命名。select name as “用户名”, age as “年龄” from users
    返回唯一值使用关键词DISTINCT可去掉返回记录中的重复值。select DISTINC Tname from users
    使用where子句where子句用于指定筛选条件,满足条件的记录才会出现在查询结果集中。select * from users where age<20
    运算符或函数==, >, <, >=, <=, !=
    between…and…
    in (…)
    like, not like
    isnull()
    not, and, or
    sum(), avg(), max(), min(), count()
    对查询结果排序order by子句用于指定排序字段,查询结果默认按升序(ASC)排序,使用DESC表示降序。
    例如:select * from users oder by age
    select * from users oder by age DESC
    可以使用多个排序字段,并分别指明排序方式。
    例如,下面的语句按name升序,age降序对查询结果排序:
    select * from users oder by name ASC, age DESC

    二、利用SQLite3管理SQLite数据库

    (一)下载sqlite3

    e语句

    更多相关内容
  • 重建的立体匹配详解

    千次阅读 2022-03-29 10:20:46
    从所有的候选像素挑选匹配代价最低的作为最终的同名点,这个策略被称为Winner Takes All (WTA),所谓的赢者通吃 那么,按照这种方法算出的视差图如何呢?我们看看下面的结果,并和Groundtruth做下对比: 肉眼判断...

    点击上方“3D视觉工坊”,选择“星标”

    干货第一时间送达

    5eb94c2456f496f267bd2bd20e7fd32d.png

    作者丨HawkWang

    来源丨计算摄影学 

    通过立体校正算法,可以把双摄图像对校正到标准形态,使得两幅图像的对极线水平对齐,就好像是我们创造了两个内参相同的虚拟相机,它们指向同一个方向进行拍摄原来的场景,得到两幅新的图像。

    04e4b06fc1b46513c90180855e61f86e.png

    当做到这一点后,就可以很方便的在水平方向搜索一个图像上的一点在另外一个图像上的对应点。如下图所示,左图上的一点p在右图上的对应点是p',接下来就很方便的进行三角测距,确定物点P的物距了。

    147ddff0165e6eea114dc9d16b3cbe3c.png

    物距Z的计算公式可以很容易通过相似三角形得出:

    92b37fa49023f5dcd9ad7d643425577f.png

    这里面, X_R-X_T叫做视差,而b是两个相机光心的距离, f是焦距。这样,求取空间点和相机之间距离的关键就变成了求取其投影点视差了。而整个图像上所有点的视差构成了一幅图像,这个图像叫做视差图,如下所示:

    282c9a45666622192d266d1c3bbcdc59.png

    而通过校正后的一对图像获取到视差图的过程,叫做立体匹配,它有点像玩连连看的游戏:给计算机一对输入图像,指定左图上的某个点,要求算法在右图上找到它对应的投影点,然后将两个点的横坐标相减得到该点的视差。

    今天我就来好好聊聊立体匹配。我最喜欢的关于立体匹配算法的基础教学课件是意大利Bologna大学的Stefano Mattoccia教授在2012年编写的"Stereo vision: algorithms and applications"(当时他还在佛罗伦萨大学)。

    7664f41fa041f3f793e0b722ab4058ee.png

    这份讲义涵盖了立体匹配的诸多基础知识,据我了解很多人也是通过这份文档入门的。由于内容过于丰富,读者自己阅读时可能会理不清其中的逻辑关系,或丢失掉一些细节信息。我希望结合自己的理解,对这份讲义加以导读,帮助你更快的入门。

    一. 从基础的立体匹配方法开始

    先来看看下面两幅经过立体校正的图像,一幅称为Reference图像(R),一幅称为Target图像(T)。现在希望求取两幅图像的视差图,正如我上面所说,这是一个让计算机做连连看游戏的过程——给定R图上一点,我们在T图的同一行上搜索和R图点匹配的同名点。

    a39c9690266dbb84150fe0dba95421d6.png

    这时,我们会将水平搜索约束在一个范围内[0, outside_default.png ],如下图所示

    4812e1ffce03bc074427105acc87b4fb.png

    现在的问题是,如何判断最匹配的点呢?

    一般来说,我们会定义某种匹配代价,用来衡量两个像素的相似程度。那么匹配代价最低的那个像素,就会被选为同名点。

    最基本的匹配代价就是两个像素的像素值的绝对差(我们可以暂且把图像当做是单通道的灰度图像),那么匹配代价就是:

    cfd1a37ee430f04062acbeeef93d2859.png

    如果最小视差为0,候选的视差值d的值域范围是从0到dmax的整数,那么可视化一下所有的匹配代价如下图所示:

    23d7e3b4cb1379bf935f5171dd857f81.png

    从所有的候选像素中挑选匹配代价最低的作为最终的同名点,这个策略被称为Winner Takes All (WTA),所谓的赢者通吃

    那么,按照这种方法算出的视差图如何呢?我们看看下面的结果,并和Groundtruth做下对比:

    f3757424d99034ac853158f63944dcf9.png

    肉眼判断视差图是否有错误可以通过下面几个准则来观察:

    • 视差是近大远小的,表现到视差图上则是近亮远暗

    • 同一个物距的物体表面的视差亮度是一致的

    • 在物体的边缘,如果物距发生了突变,那么视差图上也应该有突变的边缘

    • 物距渐变时,视差图上也是平滑变化的

    很明显,相比理想结果,这种方法的得到的视差图充满了噪声,很多地方可以肉眼可见明显的错误。我们上面这种简单的立体匹配算法很明显是不足的。接下来,我会先谈谈立体匹配的困难之处,再分析一下解决这些困难的方法。

    二. 立体匹配的困难之处

    在讲义中,Stefano教授提到的困难之处包括了:

    a7d4840344aee37c685911750942095d.png d289124fcea8297f9265af1334525b1f.png c4dc9a171aec5665f19ec8c056bbdc78.png 9f61c7028169c140f59afff88646e029.png a21e4b3713ab5eb685006c5d26250570.png

    在实际场景中,可以同时包含了以上多种困难之处,难怪立体匹配如此困难,上面那种简单的方法无法奏效。那么该如何应对这些问题呢?

    三. 立体匹配的基本思路和流程

    我们来看看解决上述困难的基本思路:

    3.1 图像预处理 Preprocess

    立体匹配的困难最终的反映为搜索同名点失败上,如果是因为两幅图像的亮度、噪声不一致,一般会先对图像做预处理,使得两幅图像的整体质量区域一致。这里面典型的方法有(这里括号中提到的参考文献都是原讲义的参考文献,读者可以自行查阅)

    5912dac09510eb9a62cf970610746605.png

    3.2 代价计算 Cost Computation

    刚才计算同名点匹配代价时采用的是单个像素点的绝对值的差异,这样很容易受到噪声的干扰。规避方法有两类:

    • 换用更鲁棒的单像素的代价函数

    • 采用邻域支持窗来计算整体代价

    我们一个个讲。

    1. 换用更鲁棒的单像素的代价函数

    37af645499053b0dd8d277597d9f7945.png

    这一类方法依然是利用左右图像上单一的像素点进行代价计算。人们设计了很多不同的代价函数计算方式,分别都有自己的优缺点,这里列出如下:

    像素差异绝对值 Absolute Differences

    9b4a75c704e94a42232db756efc6c6dc.png

    平方差 Squared Differences

    343977eeba0926c7f8598bc44571813a.png

    上面两种代价函数都容易受到噪声的干扰,于是就有了更加鲁棒的函数,比如:

    截断绝对差 Truncated Absolute Differences (TAD)

    cc06f605d46c9711231f25fd0fd3a565.png

    将绝对差限制在<=T的范围内,避免噪声引起过大的代价。这是一种简单的策略,其实并不比上面两种好多少,因为T很难确定

    还有更复杂的,通过某种对图像内容不敏感的方式来确定两个像素的不相似度,比如Birchfield and Tomasi [27]中提到的方法。它考虑了当前像素,以及其旁边的两个像素。

    b802eff83b91553b785d96fab11d222c.png

    总之,仅仅考虑单个像素,还是很难得到好的结果。更好的方式是通过计算所关注的像素点的邻域的整体情况,来提升信噪比,减少噪声的影响。我们把这个邻域范围称为“支持窗(Support Window)”,通过支持窗内所有像素来计算一个匹配代价值。

    采用邻域支持窗来计算整体代价

    c2dfe82d14aec3921469de512b0ab347.png

    这种策略就是把单个像素的计算转换为一个支持窗内的整体计算了,比如:

    像素绝对差值和 Sum of Absolute differences (SAD)

    7337cbef15ed77dd790cec892307d6b2.png

    像素差值平方和Sum of Squared differences (SSD)

    ad586484492f40b6c42465ce8405a19e.png

    截断绝对差值和 Sum of truncated absolute differences (STAD)

    57d87987574f1fe5aedb29f482924751.png

    除了这些简单的代价函数,还有更多方法,比如利用两个图像的互相关信息的,利用图像梯度域信息的,或是利用一些非参数方法的,等等。你可以参考原讲义,找到参考文献来阅读。

    总之,我们可以为R中的每个像素点和选定的T中的像素点计算一个代价,并且这个代价还具有很高的区分度。如前所述,我们是在一个范围[dmin, dmax]中搜索匹配点,因此对任何一个R中的像素点,可以算出dmax - dmin + 1种代价值。如果图像的宽高分别为W和H,那么我们总共会得到W x H x (dmax - dmin + 1)种代价值。所有这些代价值可以存储到一个立方体中,这就是所谓的代价立方体,如下所示:

    28dd54b9bf55fddffe244465722a4d69.png

    3.3 代价聚合(Cost Aggregation)和视差优化(Disparity Optimization)

    通过支持窗计算代价已经对图像的噪声、光照不一致等等提升了一定的鲁棒性,但依然有很多问题遗留下来。我用一个基本的例子加以说明。让我们用一个改进的流程来处理之前给出的一对图像:计算一个简单固定尺寸方形支持窗内的截断绝对差值和STAD,然后用WTA策略计算视差。

    dc0664032dc244af1f1c8ad48cd1b499.png

    看看上面的结果,比起最基础的方案,视差图似乎平滑了很多,没有了大片的噪声。但是很多局部是错误的,比如说灯罩边缘变得凹凸不平,背景出现异常的亮区,右上角也出现了异常的噪声,灯架断开,等等。

    固定支持窗,英文是Fixed Window,简称FW。上述结果不够理想,是因为FW策略违背了一些基础假设。我们一一列举一下:

    1. FW假设支持窗是正对相机的平面,支持窗内的所有点的视差是一致的,这显然和实际情况不一样。比如下面场景标注的支持窗,就显然不是正对相机的平面:这里人头部分是带弧度的,而下图的平面应该是倾斜的。

    8bf7691b663ca2898ee9e3f9ac23c1e5.png

    2. 支持窗忽略了窗口内深度不连续,甚至有突变的情况,而强行把窗口内的视差值加权平均到一起。这就会导致产生的视差图内出现大量的物体边缘错误。如下图所示:

    c87f3c3aae2cdeaffbf15f1954be0991.png a1cd0b23dddfa8a9d7c9f4607b4d80bf.png

    理想情况下,支持窗应该只包含同一深度的像素点,像下面一样。我后面会给出一些进行这些努力的方法。然而,现实情况是由于固定方形窗口的优点,很多算法还是采用了它。于是为了避免上面这种包含过多不同视差像素在同一个支持窗的现象,就需要适当的减小窗口的大小。但这又和我们一开始用支持窗来去除视差图中的噪声,提升信噪比的初衷违背了——于是,就需要根据实际场景的要求,经验性的调整支持窗的大小,这显然不是一件容易的事情。

    a0a609264aa0a544bf65a4706b6ee13d.png

    3. 当场景中有大面积的重复纹理、无纹理的部分时,小尺寸的支持窗无法解决同名点计算错误的问题,这种情况下可能出现很多候选像素点的代价值都一样,难以区分的情况。比较好的策略是在这些区域用尽可能大的支持窗,来提升信噪比和像素之间的区分度。而这又和上面希望减小支持窗大小避免深度不连续影响相矛盾——显然一个单一尺寸的支持窗无法应对两种情况。

    8ecb72f72bc97d1b7c22657ed40896de.png

    很明显,当完成3.2节所说的代价计算得到代价立方体后,由于计算过程中的上述问题,代价立方体中肯定有许多的噪声和错误。下面右图是另外一个场景,你应该也能观察到其视差图中的错误。

    5952348e18ecbd38e98203348b929f32.png

    尽管固定支持窗有这样那样的缺点,但它理解和实现都很容易,且非常便于并行化,在现代处理器上也比较容易做到实时运行,非常容易采用FPGA这样的硬件进行实现,性价比很足!所以很多传统算法的代价计算这一步都是采用固定大小支持窗来完成的。而要继续提升最终算法的效果,还得靠后续的步骤。

    这里主要有两大类思路,也就是局部聚合思路,和全局优化思路。

    3.3.1 代价聚合(Cost Aggregation)

    局部聚合思路是通过对代价立方体中同一视差的代价进行某种程度的聚合,来减少或消除错误代价的影响,这一步就是所谓的代价聚合(Cost Aggregation)。比如下面左图,同一个视差的窗口我们会扩大并将代价立方体中相应的代价聚合在一起。而下面右图则说明在聚合过程中要避免混合不同视差的像素。

    b328c16330d061ac8a0a570b042c5b56.png

    Stefano Mattoccia教授的讲义中介绍了各种各样代价聚合方法,它们一般来说是通过调整支持窗的位置、形状、窗内各像素的权重等等来完成聚合的。我会在下一篇文章中为你导读讲义中提到的各种各样的局部代价聚合方法。总之,通过局部的代价聚合,有可能得到非常不错的效果,比如下图中所示的一个利用了局部一致性的方案,相比FW的效果得到了很大的提升。

    4acafe8ce048f2c45a92a0dccbc7bc9b.png

    3.3.2 视差优化(Disparity Optimization)

    而全局优化思路,则是希望寻找到每个像素的最优视差结果,使得全局的、整体的匹配代价最小,这一步被称为视差优化(Disparity Optimization)。于是这个过程就变成了一个最优化某个能量函数的过程,该函数通常写成如下的形式:

    4d37d81434953592eb12fccf11f5d41a.png

    等号右边第1项是数据项,用于约束全局代价最小化。但是代价立方体中通常含有噪声和错误,直接最小化求得的结果也会有很多问题,所以还需要第2项平滑项。这一项一般用于给出某些额外的约束条件,比如通常假设整个图像的视差是平滑变化的。这样视差的大变化只会在场景内视差边缘处产生,一般也和图像内物体边缘高度相关。

    对上述能量函数的最优化过程是一个非常困难的问题,所以一般会有一些近似求解方法,比如讲义中提到的:

    aef53f5eccf579b5bf38d163771d0e44.png

    还有就是用将全局能量函数的最优化转换为针对图像中的子部分的最优化,比如约束到某些扫描线方向上的最优化,然后利用动态规划或扫描线优化等方式去求解。

    关于视差优化,我也会在后面专门的文章中再阐述细节。但至少当时,全局法的效果确实比起很多局部法要好,我们看下面这些例子,就很清楚了:

    02a7b2c1fa7e6737396e6facc414539f.png 9c356588248500852364c2f0e313c9c4.png cd06c6b4f3f5410a736b91c5dd38c51b.png

    3.4 视差后处理(Disparity Refinement)

    前面介绍的步骤最终将输出一张视差图,然而正如你已经看到的,即便是在上面那些受约束的场景,得到的视差图依然不是完美的,还是有很多错误。因此,还需要一个后处理的步骤,来消除其中的错误,得到更准确的视差图,这一步被Stefano教授称为Disparity Refinement。我感觉Disparity Refinement比较容易和全局法的Disparity Optimization在字面上混淆,因此就翻译做视差后处理吧,如下图所示。

    e50bbd1e90bc373d41fd25d5dd42d250.png

    这一步需要解决哪些问题呢?这包括了:

    • 亚像素插值:我们上面计算的视差值都是离散的整数值,但实际场景物体存在连续变化的视差,我们希望得到以浮点数表示的更精细的视差值。一般来说,会采用某种二次的抛物线插值法,得到连续的视差值,计算量也比较低,结果也不错。

    58e6be5b7b0f42b5e2087bd09f343ce5.png

    噪声和错误消除:有时候会简单采用图像滤波的技术来处理视差图,也能得到不错的结果。从简单的中值滤波,到复杂的双边滤波都有人尝试。我会在之后的文章专门介绍一种强大的滤波类的处理方法。另外一个重要的技巧是双向匹配,这种方法分别以双目图像中左图和右图作为参考图像R计算两个视差图(缺点:增加了计算量)。然后它认为一对匹配点的视差值是互反的,也就是说一对正确匹配点的视差值会非常接近。如果不满足这个条件那么对应的视差值应该就是错误的。比如下面红色点的视差就计算错误了,而绿色点则是正确的。

    96b014398017ec55fc39a434edde05ca.png

    关于视差后处理,可谈的内容也挺多的,考虑到篇幅限制,这里就先不深入了,之后的文章再补上吧。总之,通过组合前面的步骤,我们就可以得到最终的视差图了。

    3649aa837caa8d8ff97448262d44eed7.png

    四. 总结和展望

    今天这一篇文章是我要写的关于立体匹配的文章的第1篇,主要是对Stefano Mattoccia教授的讲义的一个导读。主要为你介绍了立体匹配的一些基本概念和步骤。在接下来的几篇文章中,我还是会继续导读这份讲义,主要展开讲解代价聚合、视差优化,以及视差后处理。当这些部分都搞清楚后,我就会再介绍一些经典的算法,包括传统的局部法、全局法、半全局法,以及基于深度学习的某些方法。希望整个内容能有机的连成一片。

    73acb1e3e1d234c61f94d00b621ef2a6.png

    当然,毕竟这是一个2012~2013年间的讲义,很多后来的优秀方法都没有包含在内。比如我现在团队所开发的方法,已经能在非常非常挑战的场景下得到非常非常精细的结果了,这是以前这些方法无法想象的。但Stefano教授提到的这些本质性的挑战和优化思想,依然在指引着后来的研究者。我在之后也会介绍今年CVPR中我们的一篇文章,看看我们是如何把传统视觉方法和深度学习方法结合起来,用到匹配中的。

    2039cc78a0b78ede96e416d49b4ae8c1.png

    五. 参考资料

    Stefano Mattoccia, Stereo Vision: Algorithms and Applications, 2012

    本文仅做学术分享,如有侵权,请联系删文。

    干货下载与学习

    后台回复:巴塞罗自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件

    后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf

    后台回复:3D视觉课程,即可学习3D视觉领域精品课程

    3D视觉精品课程推荐:

    1.面向自动驾驶领域的多传感器数据融合技术

    2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
    3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
    4.国内首个面向工业级实战的点云处理课程
    5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
    6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
    7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
    8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

    9.从零搭建一套结构光3D重建系统[理论+源码+实践]

    10.单目深度估计方法:算法梳理与代码实现

    11.自动驾驶中的深度学习模型部署实战

    12.相机模型与标定(单目+双目+鱼眼)

    13.重磅!四旋翼飞行器:算法与实战

    14.ROS2从入门到精通:理论与实战

    15.国内首个3D缺陷检测教程:理论、源码与实战

    重磅!3DCVer-学术论文写作投稿 交流群已成立

    扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

    同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

    一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

    686833ed87f984ce94eb066767e34d79.png

    ▲长按加微信群或投稿

    72f5107c889bd9a7d7181c3d4948f756.png

    ▲长按关注公众号

    3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近5000星球成员为创造更好的AI世界共同进步,知识星球入口:

    学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

    85d2f605d5ce8ee1f968777de33e09f2.png

     圈里有高质量教程资料、答疑解惑、助你高效解决问题

    觉得有用,麻烦给个赞和在看~  4efa08278b609519a31f503439e6868f.gif

    展开全文
  • 事实与维度

    千次阅读 2021-08-26 15:49:19
    文章目录前言一、事实表1.2、事实表的特征1.3、事实表的类型1.3.1、...2.3、维度表的好处三、维度表 vs 事实表3.1、事实表和维表之间的主要区别3.2、对比项关注我的公众号【宝哥大数据】,更多干货 前言 事实表包含系统

    前言

    事实表包含系统的事实作为其数据内容,维度表包含事实表的所有属性或对象,这些属性或对象有助于将事实表连接到各个维度表。两个表中的数据都可以是普通的文本格式,而事实表可以有数字和文本。在创建数据库的过程中,维度表由于其自身的特性,先于事实表创建。

    一、事实表

    数据仓库系统中的事实表只不过是包含所有事实或业务信息的表,可以在需要时进行分析和报告活动。这些表包含表示直接事实的字段,以及用于将事实表与数据仓库系统中的其他维度表连接起来的外部字段。一个数据仓库系统可以有一个或多个事实表,这取决于用于设计数据仓库的模型类型。

    1.2、事实表的特征

    • 键: 它有一个键或一个主键,它是与其链接的所有维度表的所有主键的累积。该键称为串联键,有助于唯一标识该行。
    • 事实表粒度: 表的粒度描述了该表中包含的信息的详细程度或深度。级别越高,表的效率越高。
    • 添加度量: 此中存在的属性可以是完全添加、非添加或半添加。将完全可加或可加的度量添加到所有维度。半加性是添加到某些维度而非所有维度的那些度量,非加性度量是存储业务流程的基本度量单位。
    • 稀疏数据: 有些记录的属性包含空值或度量。他们不提供任何信息。
    • 收缩汇总维度: 收缩汇总维度是基础维度的细分。

    1.3、事实表的类型

    它分为三个基本测量事件

    • 事务性
    • 定期快照
    • 累积快照

    1.3.1、交易事实表

    这是业务运营的基本和基本观点。它用于表示在任何瞬时时间点发生的事件。事实度量仅对那个特定时刻有效,并且只对那个事件有效。与事务表关联的粒度指定为“事务中每行一行”。通常,它包含详细级别的数据,这导致它具有大量关联的维度。它在最基本的或原子级别的维度上捕获测量。这有助于表格为用户提供强大的维度分组、汇总和向下钻取报告功能。它密集而稀疏。它可能很大,可能包含数十亿条记录。让我们看一个杂货店销售的例子。
    在这里插入图片描述

    1.3.2、快照事实表

    快照给出了特定时间实例或“瞬间图片”的事物状态。它通常包括更多的非加成和半加成事实。它有助于定期和可预测的时间间隔审查业务的累积绩效。在这种情况下,表示在每天或一周或一个月或任何其他时间间隔结束时的活动性能,这与事务事实表不同,其中为每个事件的发生添加新行。但是快照事实表或定期快照依赖于事务事实表来获取事务事实表中存在的详细数据。周期快照表大多是密集的,并且可以像事务事实表一样大。让我们看一下交易事实表中同一家杂货店销售额的定期快照示例。

    在这里插入图片描述

    1.3.3、积累事实表

    这些用于表示具有明确定义和明确开始和结束的任何流程的活动。累积快照大多具有多个数据戳,代表生命周期中发生的可预测阶段或事件。有时会有一个额外的列包含显示该行上次更新时间的日期。让我们看一个例子。

    累积 -1.3

    1.4、它如何在数据仓库中工作?

    它基本上代表与事件相关的指标。任何事实表的含义都必须由表名或表主键的组成来表示。最重要的选择是决定主键。也可以创建代理键作为主键。如果用户不想使用代理键,那么他可以使用指向与事实相关的维度组合的外键组合。使用外键可以了解 表的粒度 或 粒度。

    Kimball 描述了可以遵循的四个设计步骤:

    • 选择要建模的业务流程。
    • 声明谷物。
    • 选择维度。
    • 识别事实。

    1.5、事实表的优点

    • 它包含用于分析的定量信息。
    • 它包含的性能指标通常是标准化的。
    • 它可以包含不同的度量,如加性、半加性和非加性。

    二、维度表

    维度表存在于星型或雪花模型中。维度表有助于描述维度,即维度值、属性和键。它的尺寸通常很小。大小可以从几行到几千行不等。它描述了事实表中存在的对象。维度表是指与任何可测量事件相关的信息的集合或组。它们构成了维度建模的核心。它包含一个可以被视为主键列的列,有助于唯一标识每个维度行或记录。它通过这个键与事实表连接。创建时,系统生成的称为代理键的键用于唯一标识维度中的行。

    为什么我们需要使用?

    • 它有助于存储历史信息或维度信息。
    • 它比规范化表更容易理解。
    • 可以向表中添加更多列,而不会影响使用这些列的现有应用程序。

    2.1、维度表类型

    2.1.1、SCD(缓慢变化维)

    倾向于随时间缓慢变化而不是在固定时间间隔内变化的维度属性称为缓慢变化维度。例如地址和电话号码更改但不定期更改。让我们看一个例子,一个人去不同的国家旅行,所以他需要根据那个国家改变他的地址。这可以通过三种方式完成:

    类型 1:覆盖之前的值。这种方法易于应用,有助于节省空间从而降低成本。但是,在这种情况下,历史丢失了。

    更改前的表

    ID姓名国家国籍
    1001雷切尔印度印度人

    更改后的表

    ID姓名国家国籍
    1001雷切尔中国印度人

    类型 2:添加具有新值的新行。在这种方法中,历史被保存并且可以在必要时使用。但占用空间大,增加了成本。

    更改前的表

    ID姓名国家国籍
    1001雷切尔印度印度人

    更改后的表

    ID姓名国家国籍
    1001雷切尔印度印度人
    1001雷切尔中国印度人

    类型 3:添加新列。这是最好的方法,因为历史可以轻松维护。

    更改前的表

    ID姓名国家国籍
    1001雷切尔印度印度人

    更改后的表

    ID姓名国家老国家国籍
    1001雷切尔中国印度印度人

    2.1.2、一致维度

    该维度在多个主题领域或数据集市之间共享。同样可以在不同的项目中使用,而无需在同一项目中进行任何修改。这用于保持一致性。一致维度是那些完全相同或任何其他维度的适当子集的维度。

    2.1.3、垃圾维度

    垃圾维度是一组低基数的属性。它包含与任何其他属性无关的不同或各种属性。这些可用于实现 RCD(快速变化的维度),例如标志、权重等。

    2.1.4、退化维度

    它存储在事实表本身中而不是作为单独的维度表存储的属性,这些属性称为退化维度。例如票号、发票号、交易号等。

    2.1.5、角色扮演维度

    与事实表的多重关系称为角色扮演维度。换句话说,当同一个维度键及其所有相关属性与事实表中的许多外键连接时。它可以在同一个现有数据库中实现多种用途。

    2.2、它在数据仓库中是如何工作的?

    • 维度是指与任何可测量事件相关的信息的集合或组。它们构成了维度建模的核心。创建维度时,会生成项目的结构。Created 可以跨不同的项目使用,它反映了可重用性的想法。当其中任何一项发生更改时,其影响仅反映在该特定表中。当要创建报告时,用户可以从维度表中获取数据,因为维度表包含所有必要的信息。
    • 当执行维度建模时,原子数据被加载到维度结构中。然后围绕业务流程生成或构建维度模型。创建时必须记住过滤域值并将报告的标签存储在这些表中。必须确保在创建维度表时必须使用代理键(在创建维度表期间使用的系统生成的键,它有助于唯一标识维度表中存在的每条记录。)。它必须是非规范化的,因为它们的任务是让用户轻松高效地读取和分析数据,而不是管理事务。维度的主要目的是提供过滤、执行分组和高效标记。

    2.3、维度表的好处

    • 它具有简单的结构。
    • 很容易分析和理解。
    • 非规范化数据。
    • 有助于维护任何维度的历史信息。
    • 很容易从中检索数据。
    • 快速创建和实施。
    • 它提供了任何业务流程的上下文。

    三、维度表 vs 事实表

    3.1、事实表和维表之间的主要区别

    • 事实表包含维度表的属性的值或度量。
    • 事实表包含更少的属性和更多的记录,而维度表包含更少的记录和更多的属性。
    • 事实表垂直增长,而维度表水平增长。
    • 事实表包含一个连接键,而维度表包含一个主键。
    • 必须在创建事实表之前创建维度表。
    • 任何模式都包含更多的维度表和更少的事实表。

    3.2、对比项

    特征事实表尺寸表
    基本定义它包含属性的度量、事实或度量。它是包含使用哪个事实表推断事实的属性的伴随表。
    设计它由数据粒度定义。它是描述性的、完整的和冗长的。
    任务它包含度量并用于分析和决策。它包含有关业务及其流程的信息。
    数据类型它包含数字和文本格式的数据。它只包含文本格式的数据。
    key每个维度都有一个主键,作为维度表中的外键。它有一个与事实表的主键相关联的外键。
    存储它将过滤器域和报告标签存储在维度表中。它将详细的原子数据存储到维度结构中。
    等级制度它没有层次结构。它包含一个层次结构。
    属性它的属性较少更多属性
    记录更多记录记录少。
    表增长桌子垂直增长。桌子水平增长。
    创建时间创建维度表后,会创建事实表。首先需要创建维度表。
    模式结构模式中的事实表数量较少。模式中有许多维度表。

    关注我的公众号【宝哥大数据】,更多干货

    在这里插入图片描述

    展开全文
  • 从所有的候选像素挑选匹配代价最低的作为最终的同名点,这个策略被称为Winner Takes All (WTA),所谓的赢者通吃 那么,按照这种方法算出的视差图如何呢?我们看看下面的结果,并和Groundtruth做下对比: 肉眼判断...

    点击上方“计算机视觉工坊”,选择“星标”

    干货第一时间送达

    85277b8705f877a686c42424c780e669.png

    作者丨HawkWang

    来源丨计算摄影学 

    通过立体校正算法,可以把双摄图像对校正到标准形态,使得两幅图像的对极线水平对齐,就好像是我们创造了两个内参相同的虚拟相机,它们指向同一个方向进行拍摄原来的场景,得到两幅新的图像。

    8e34ed4bf9a02243172ade7bd1f1b76d.png

    当做到这一点后,就可以很方便的在水平方向搜索一个图像上的一点在另外一个图像上的对应点。如下图所示,左图上的一点p在右图上的对应点是p',接下来就很方便的进行三角测距,确定物点P的物距了。

    404872ab112c5998fc19e5b03717ba0c.png

    物距Z的计算公式可以很容易通过相似三角形得出:

    05e895dca1157928343ea1cb2a34e374.png

    这里面, X_R-X_T叫做视差,而b是两个相机光心的距离, f是焦距。这样,求取空间点和相机之间距离的关键就变成了求取其投影点视差了。而整个图像上所有点的视差构成了一幅图像,这个图像叫做视差图,如下所示:

    fed1761a7055c715d6ca3fc0c7ea4813.png

    而通过校正后的一对图像获取到视差图的过程,叫做立体匹配,它有点像玩连连看的游戏:给计算机一对输入图像,指定左图上的某个点,要求算法在右图上找到它对应的投影点,然后将两个点的横坐标相减得到该点的视差。

    今天我就来好好聊聊立体匹配。我最喜欢的关于立体匹配算法的基础教学课件是意大利Bologna大学的Stefano Mattoccia教授在2012年编写的"Stereo vision: algorithms and applications"(当时他还在佛罗伦萨大学)。

    46e9757d04a997e6aa9c690f279aa7a6.png

    这份讲义涵盖了立体匹配的诸多基础知识,据我了解很多人也是通过这份文档入门的。由于内容过于丰富,读者自己阅读时可能会理不清其中的逻辑关系,或丢失掉一些细节信息。我希望结合自己的理解,对这份讲义加以导读,帮助你更快的入门。

    一. 从基础的立体匹配方法开始

    先来看看下面两幅经过立体校正的图像,一幅称为Reference图像(R),一幅称为Target图像(T)。现在希望求取两幅图像的视差图,正如我上面所说,这是一个让计算机做连连看游戏的过程——给定R图上一点,我们在T图的同一行上搜索和R图点匹配的同名点。

    c44442566305cdcac6da13b8e30beba7.png

    这时,我们会将水平搜索约束在一个范围内[0, outside_default.png ],如下图所示

    4c78a44bbd0607ab623bb4aa288dd3eb.png

    现在的问题是,如何判断最匹配的点呢?

    一般来说,我们会定义某种匹配代价,用来衡量两个像素的相似程度。那么匹配代价最低的那个像素,就会被选为同名点。

    最基本的匹配代价就是两个像素的像素值的绝对差(我们可以暂且把图像当做是单通道的灰度图像),那么匹配代价就是:

    a094c1c4351a469dee63309a6d4e7512.png

    如果最小视差为0,候选的视差值d的值域范围是从0到dmax的整数,那么可视化一下所有的匹配代价如下图所示:

    34002796162428ae07a7d0abc1d06cd0.png

    从所有的候选像素中挑选匹配代价最低的作为最终的同名点,这个策略被称为Winner Takes All (WTA),所谓的赢者通吃

    那么,按照这种方法算出的视差图如何呢?我们看看下面的结果,并和Groundtruth做下对比:

    9640329358c5647edd6b25ac97e56085.png

    肉眼判断视差图是否有错误可以通过下面几个准则来观察:

    • 视差是近大远小的,表现到视差图上则是近亮远暗

    • 同一个物距的物体表面的视差亮度是一致的

    • 在物体的边缘,如果物距发生了突变,那么视差图上也应该有突变的边缘

    • 物距渐变时,视差图上也是平滑变化的

    很明显,相比理想结果,这种方法的得到的视差图充满了噪声,很多地方可以肉眼可见明显的错误。我们上面这种简单的立体匹配算法很明显是不足的。接下来,我会先谈谈立体匹配的困难之处,再分析一下解决这些困难的方法。

    二. 立体匹配的困难之处

    在讲义中,Stefano教授提到的困难之处包括了:

    7a8c654ae96a5f35a8f10c032435e879.png 9c6bb9f08b79de94f1e91e17318c769b.png 7cb87d3fccb08bb4b3a637dd140263ab.png 9a386ea15a6fa0f48766d9697d46dfeb.png 8580c9b10c9186e0e315739cc784a0ed.png

    在实际场景中,可以同时包含了以上多种困难之处,难怪立体匹配如此困难,上面那种简单的方法无法奏效。那么该如何应对这些问题呢?

    三. 立体匹配的基本思路和流程

    我们来看看解决上述困难的基本思路:

    3.1 图像预处理 Preprocess

    立体匹配的困难最终的反映为搜索同名点失败上,如果是因为两幅图像的亮度、噪声不一致,一般会先对图像做预处理,使得两幅图像的整体质量区域一致。这里面典型的方法有(这里括号中提到的参考文献都是原讲义的参考文献,读者可以自行查阅)

    8be1fe1e3098db754e21ecfbbf7bab4a.png

    3.2 代价计算 Cost Computation

    刚才计算同名点匹配代价时采用的是单个像素点的绝对值的差异,这样很容易受到噪声的干扰。规避方法有两类:

    • 换用更鲁棒的单像素的代价函数

    • 采用邻域支持窗来计算整体代价

    我们一个个讲。

    1. 换用更鲁棒的单像素的代价函数

    75a74061c746d32d33df984fe945359c.png

    这一类方法依然是利用左右图像上单一的像素点进行代价计算。人们设计了很多不同的代价函数计算方式,分别都有自己的优缺点,这里列出如下:

    像素差异绝对值 Absolute Differences

    0b8921811cd52b39add65e84f70627a9.png

    平方差 Squared Differences

    144dcbf5d0f9e5b4ee3c1ccebf0d6849.png

    上面两种代价函数都容易受到噪声的干扰,于是就有了更加鲁棒的函数,比如:

    截断绝对差 Truncated Absolute Differences (TAD)

    ab6d759c62f4d63abcdaf072e5125317.png

    将绝对差限制在<=T的范围内,避免噪声引起过大的代价。这是一种简单的策略,其实并不比上面两种好多少,因为T很难确定

    还有更复杂的,通过某种对图像内容不敏感的方式来确定两个像素的不相似度,比如Birchfield and Tomasi [27]中提到的方法。它考虑了当前像素,以及其旁边的两个像素。

    9635bb7fc28caee538e5f16f31de4b80.png

    总之,仅仅考虑单个像素,还是很难得到好的结果。更好的方式是通过计算所关注的像素点的邻域的整体情况,来提升信噪比,减少噪声的影响。我们把这个邻域范围称为“支持窗(Support Window)”,通过支持窗内所有像素来计算一个匹配代价值。

    采用邻域支持窗来计算整体代价

    53dcb5bce84f9a4717db37bd0ed9c36e.png

    这种策略就是把单个像素的计算转换为一个支持窗内的整体计算了,比如:

    像素绝对差值和 Sum of Absolute differences (SAD)

    2f217988a0a3ffe7e1b565861bdbbc5b.png

    像素差值平方和Sum of Squared differences (SSD)

    2e2594cba602cf6cf9d91f16aa7a2863.png

    截断绝对差值和 Sum of truncated absolute differences (STAD)

    03e7f4f0b1057aa3a001a36767936e87.png

    除了这些简单的代价函数,还有更多方法,比如利用两个图像的互相关信息的,利用图像梯度域信息的,或是利用一些非参数方法的,等等。你可以参考原讲义,找到参考文献来阅读。

    总之,我们可以为R中的每个像素点和选定的T中的像素点计算一个代价,并且这个代价还具有很高的区分度。如前所述,我们是在一个范围[dmin, dmax]中搜索匹配点,因此对任何一个R中的像素点,可以算出dmax - dmin + 1种代价值。如果图像的宽高分别为W和H,那么我们总共会得到W x H x (dmax - dmin + 1)种代价值。所有这些代价值可以存储到一个立方体中,这就是所谓的代价立方体,如下所示:

    f55436a9ca9628ee82cfa56c6eaa5795.png

    3.3 代价聚合(Cost Aggregation)和视差优化(Disparity Optimization)

    通过支持窗计算代价已经对图像的噪声、光照不一致等等提升了一定的鲁棒性,但依然有很多问题遗留下来。我用一个基本的例子加以说明。让我们用一个改进的流程来处理之前给出的一对图像:计算一个简单固定尺寸方形支持窗内的截断绝对差值和STAD,然后用WTA策略计算视差。

    1b8a10c16f4781fddd4cf64ba6a8d716.png

    看看上面的结果,比起最基础的方案,视差图似乎平滑了很多,没有了大片的噪声。但是很多局部是错误的,比如说灯罩边缘变得凹凸不平,背景出现异常的亮区,右上角也出现了异常的噪声,灯架断开,等等。

    固定支持窗,英文是Fixed Window,简称FW。上述结果不够理想,是因为FW策略违背了一些基础假设。我们一一列举一下:

    1. FW假设支持窗是正对相机的平面,支持窗内的所有点的视差是一致的,这显然和实际情况不一样。比如下面场景标注的支持窗,就显然不是正对相机的平面:这里人头部分是带弧度的,而下图的平面应该是倾斜的。

    b778801602016220fc5133484edbfda8.png

    2. 支持窗忽略了窗口内深度不连续,甚至有突变的情况,而强行把窗口内的视差值加权平均到一起。这就会导致产生的视差图内出现大量的物体边缘错误。如下图所示:

    1d7168c6edada3172f83696183c1f20e.png f56e28e2e152da972857d0510239531a.png

    理想情况下,支持窗应该只包含同一深度的像素点,像下面一样。我后面会给出一些进行这些努力的方法。然而,现实情况是由于固定方形窗口的优点,很多算法还是采用了它。于是为了避免上面这种包含过多不同视差像素在同一个支持窗的现象,就需要适当的减小窗口的大小。但这又和我们一开始用支持窗来去除视差图中的噪声,提升信噪比的初衷违背了——于是,就需要根据实际场景的要求,经验性的调整支持窗的大小,这显然不是一件容易的事情。

    ec2f10d53bcbfff38370ae5250a0e43c.png

    3. 当场景中有大面积的重复纹理、无纹理的部分时,小尺寸的支持窗无法解决同名点计算错误的问题,这种情况下可能出现很多候选像素点的代价值都一样,难以区分的情况。比较好的策略是在这些区域用尽可能大的支持窗,来提升信噪比和像素之间的区分度。而这又和上面希望减小支持窗大小避免深度不连续影响相矛盾——显然一个单一尺寸的支持窗无法应对两种情况。

    3ef234d5199257f0a5ae95d9705fbe36.png

    很明显,当完成3.2节所说的代价计算得到代价立方体后,由于计算过程中的上述问题,代价立方体中肯定有许多的噪声和错误。下面右图是另外一个场景,你应该也能观察到其视差图中的错误。

    c19203acd76813f1cf07e59b6d3262ed.png

    尽管固定支持窗有这样那样的缺点,但它理解和实现都很容易,且非常便于并行化,在现代处理器上也比较容易做到实时运行,非常容易采用FPGA这样的硬件进行实现,性价比很足!所以很多传统算法的代价计算这一步都是采用固定大小支持窗来完成的。而要继续提升最终算法的效果,还得靠后续的步骤。

    这里主要有两大类思路,也就是局部聚合思路,和全局优化思路。

    3.3.1 代价聚合(Cost Aggregation)

    局部聚合思路是通过对代价立方体中同一视差的代价进行某种程度的聚合,来减少或消除错误代价的影响,这一步就是所谓的代价聚合(Cost Aggregation)。比如下面左图,同一个视差的窗口我们会扩大并将代价立方体中相应的代价聚合在一起。而下面右图则说明在聚合过程中要避免混合不同视差的像素。

    a0f698d6425c11e1fa25f56f38f6ae8f.png

    Stefano Mattoccia教授的讲义中介绍了各种各样代价聚合方法,它们一般来说是通过调整支持窗的位置、形状、窗内各像素的权重等等来完成聚合的。我会在下一篇文章中为你导读讲义中提到的各种各样的局部代价聚合方法。总之,通过局部的代价聚合,有可能得到非常不错的效果,比如下图中所示的一个利用了局部一致性的方案,相比FW的效果得到了很大的提升。

    92f76c66e94a42cee6b4871b90fd1627.png

    3.3.2 视差优化(Disparity Optimization)

    而全局优化思路,则是希望寻找到每个像素的最优视差结果,使得全局的、整体的匹配代价最小,这一步被称为视差优化(Disparity Optimization)。于是这个过程就变成了一个最优化某个能量函数的过程,该函数通常写成如下的形式:

    2ecdebca3f7036f6fca5e08343def08d.png

    等号右边第1项是数据项,用于约束全局代价最小化。但是代价立方体中通常含有噪声和错误,直接最小化求得的结果也会有很多问题,所以还需要第2项平滑项。这一项一般用于给出某些额外的约束条件,比如通常假设整个图像的视差是平滑变化的。这样视差的大变化只会在场景内视差边缘处产生,一般也和图像内物体边缘高度相关。

    对上述能量函数的最优化过程是一个非常困难的问题,所以一般会有一些近似求解方法,比如讲义中提到的:

    3464ff4a9f0abcfaa945dc1ecaa5b944.png

    还有就是用将全局能量函数的最优化转换为针对图像中的子部分的最优化,比如约束到某些扫描线方向上的最优化,然后利用动态规划或扫描线优化等方式去求解。

    关于视差优化,我也会在后面专门的文章中再阐述细节。但至少当时,全局法的效果确实比起很多局部法要好,我们看下面这些例子,就很清楚了:

    6a13ef45dc9216255f32918f6cbe1680.png 3903650e6c326260be89005d43e051d5.png e72ab49785097dd93302e3adc8d413e4.png

    3.4 视差后处理(Disparity Refinement)

    前面介绍的步骤最终将输出一张视差图,然而正如你已经看到的,即便是在上面那些受约束的场景,得到的视差图依然不是完美的,还是有很多错误。因此,还需要一个后处理的步骤,来消除其中的错误,得到更准确的视差图,这一步被Stefano教授称为Disparity Refinement。我感觉Disparity Refinement比较容易和全局法的Disparity Optimization在字面上混淆,因此就翻译做视差后处理吧,如下图所示。

    d8b21316ae480f79c5e8ae2fc132dbcc.png

    这一步需要解决哪些问题呢?这包括了:

    • 亚像素插值:我们上面计算的视差值都是离散的整数值,但实际场景物体存在连续变化的视差,我们希望得到以浮点数表示的更精细的视差值。一般来说,会采用某种二次的抛物线插值法,得到连续的视差值,计算量也比较低,结果也不错。

    dd3bf921fd2de3ab9a9add95775eb0ca.png

    噪声和错误消除:有时候会简单采用图像滤波的技术来处理视差图,也能得到不错的结果。从简单的中值滤波,到复杂的双边滤波都有人尝试。我会在之后的文章专门介绍一种强大的滤波类的处理方法。另外一个重要的技巧是双向匹配,这种方法分别以双目图像中左图和右图作为参考图像R计算两个视差图(缺点:增加了计算量)。然后它认为一对匹配点的视差值是互反的,也就是说一对正确匹配点的视差值会非常接近。如果不满足这个条件那么对应的视差值应该就是错误的。比如下面红色点的视差就计算错误了,而绿色点则是正确的。

    5ed8720190d005224c863807cfacfbb7.png

    关于视差后处理,可谈的内容也挺多的,考虑到篇幅限制,这里就先不深入了,之后的文章再补上吧。总之,通过组合前面的步骤,我们就可以得到最终的视差图了。

    446a739f116bb28a7547466bccc25d82.png

    四. 总结和展望

    今天这一篇文章是我要写的关于立体匹配的文章的第1篇,主要是对Stefano Mattoccia教授的讲义的一个导读。主要为你介绍了立体匹配的一些基本概念和步骤。在接下来的几篇文章中,我还是会继续导读这份讲义,主要展开讲解代价聚合、视差优化,以及视差后处理。当这些部分都搞清楚后,我就会再介绍一些经典的算法,包括传统的局部法、全局法、半全局法,以及基于深度学习的某些方法。希望整个内容能有机的连成一片。

    d8cfc92e2c3c350eac46fff5e822dcc4.png

    当然,毕竟这是一个2012~2013年间的讲义,很多后来的优秀方法都没有包含在内。比如我现在团队所开发的方法,已经能在非常非常挑战的场景下得到非常非常精细的结果了,这是以前这些方法无法想象的。但Stefano教授提到的这些本质性的挑战和优化思想,依然在指引着后来的研究者。我在之后也会介绍今年CVPR中我们的一篇文章,看看我们是如何把传统视觉方法和深度学习方法结合起来,用到匹配中的。

    77f37615e3903d3bef89b728b6f007a9.png

    五. 参考资料

    Stefano Mattoccia, Stereo Vision: Algorithms and Applications, 2012

    本文仅做学术分享,如有侵权,请联系删文。

    干货下载与学习

    后台回复:巴塞罗自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件

    后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf

    后台回复:3D视觉课程,即可学习3D视觉领域精品课程

    3D视觉精品课程推荐:

    1.面向自动驾驶领域的多传感器数据融合技术

    2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
    3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
    4.国内首个面向工业级实战的点云处理课程
    5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
    6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
    7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
    8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

    9.从零搭建一套结构光3D重建系统[理论+源码+实践]

    10.单目深度估计方法:算法梳理与代码实现

    11.自动驾驶中的深度学习模型部署实战

    12.相机模型与标定(单目+双目+鱼眼)

    13.重磅!四旋翼飞行器:算法与实战

    14.ROS2从入门到精通:理论与实战

    重磅!计算机视觉工坊-学习交流群已成立

    扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

    同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

    1e63defeebd8a4b1f139f713e40b8153.png

    ▲长按加微信群或投稿

    d90486b82a92c6592aa67a4f571000a7.png

    ▲长按关注公众号

    3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

    学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

    6810f4c129d4358bd19f6c96b85dd94f.png

     圈里有高质量教程资料、可答疑解惑、助你高效解决问题

    觉得有用,麻烦给个赞和在看~

    展开全文
  • 做过类似项目的同学,应该知道此类项目好友之间的关系设计比较复杂,如果用传统的关系型数据库来设计,比如MySQL,那好友之间的关系需要用一张中间来表示,如下所示: user_id follow_id 1 5 ...
  • 聊聊数据仓库维度设计的三事

    多人点赞 热门讨论 2020-11-21 21:48:57
    维度表是维度建模的灵魂,在维度表设计碰到的问题(如维度变化、维度层次、维度一致性、维度整合和拆分等)都直接关系到维度建模的好坏,因此良好的维表设计就显得至关重要,今天我们就一起来探究下关于维表设计的...
  • Python 级选择题

    千次阅读 2020-11-23 20:09:03
    88.下面代码的输出结果是 ( A )print(round(0.1 + 0.2,1) == 0.3)A: TrueB: 0C: 1D: False解释: round 是一个四舍五入的函数,两个参数,第一个是值,第个是 取值的小数位数。0.1 + 0.2 = 0.30000000000000004...
  • 点击上方“3D视觉工坊”,选择“星标”干货第一时间送达今天分享的是:深度学习领域基于图像的三物体重建最新方法及未来趋势综述。原文:Image-based 3D Object Recon...
  • 关系数据库数据的逻辑结构是一张扁平的二维表。 1.域(domain) 定义2.1 域是一组具有相同数据类型的值的集合。 2.笛卡尔积(cartesian product) 定义2.2 给定一组域Di , D2 , …,Dn , 允许其中某些域是相同...
  • 点击上方“计算机视觉工坊”,选择“星标”干货第一时间送达来源丨三匠心编辑丨3D视觉开发者社区✦导读✦本文作者对基于RGB-D相机的三重建做了系统性的总结与分析,对各类算法都有简要的介绍,逻辑清晰,讲解...
  • 全量表没有分区,表中的数据是前一天的所有数据,比如说今天是24号,那么全量表里面拥有的数据是23号的所有数据,每次往全量表里面写数据都会覆盖之前的数据,所以全量不能记录历史的数据情况,只有截止到当前最新...
  • 一 、引言 建立三点云之间的正确匹配关系,也称为点云配准问题,这在三计算机视觉是一个基石。一个至关重要的原因是基于局部形状特征的匹配方式的应用,如三对象识别,点云注册、形状检索和三对象分类...
  • 为进行特征选择,通常利用人体的2D joint landmark (骨骼关键点))或者silhouette(剪影,这个词指三维到二维的投影,可以不严谨地理解为分割)来进行特征选择。但是这些2D先验对3D任务的作用并没有得到清晰的分析。...
  • 简言之,回归最简单的定义就是: 给出一个点集,构造一个函数来拟合这个点集,并且尽可能的让该点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归,如果曲线是一条三次曲线,就被称为三...
  • 对变量赋值的意思是将值赋给变量,赋值完成后,变量所指向的存储单元存储了赋的值,在Pyhton语言赋值操作符为“=、+=、-=、*=、/=、%=、**=、//=”。 当程序使用变量存储数据时,必须要先声明变量,然后才能使用...
  • 虚拟经济虚假营销的行为很普遍,前有腾讯天美辟谣与StarSharks无任何业务关系,后有杰威尔公司辟谣周杰伦入局NFT项目... 那你知道易建联将Instagram头像换为GameFi项目MetaRim相关NFT了吗? 据悉,MetaRim 是一个...
  • 面渣逆袭系列继续,图文详解Redis五十问!全网最全,建议收藏!
  • 点击上方“计算机视觉工坊”,选择“星标”干货第一时间送达作者丨仿佛若有光来源丨CV技术指南编辑丨极市平台导读本文回顾了ViT的结构,总结了计算机视觉的transformer的主要改进思...
  • 【数据结构基础笔记】第章线性表之顺序

    千次阅读 多人点赞 2018-08-03 18:47:57
    章一共四小节,第节讲的是顺序的相关概念及实现,顺序是线性表的顺序存储结构,是后续顺序存储的基础。在本节代码,我会加上我大量的个人代码理解,包括我思考的一些问题和我自己得到的答案(问题加粗并...
  • 作者丨ronghuaiyang来源丨AI公园编辑丨极市平台计算机视觉是计算机科学的一个领域,主要研究从数字图像自动提取信息。在过去的十年,在深度学习方面的创新,大量数据的方便获取以及GPU的使用已经将计算机视觉...
  • 所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习...
  • 数据库应用——在线考试复习资料 一、单选题 1.“表达式生成器”是用来书写什么的? A....B....C....D....2.在使用计算控件时,每个表示式前必须加上哪种运算符号?...B....A....6.以下哪种不包括在动作查询? A.更新查
  • 维度在维度建模相当重要,在维度设计的一些问题直接关系到维度建模的好坏。 1、维度变化 维度通常来自于业务系统,比如商品维度可能来自超时pos系统的商品,但是商品会变化的,比如类目,标签价格,...
  • 数据仓库建模方法及企业数据台建设。
  • 一、数据仓库 与 传统数据库 区别、 、数据仓库系统体系结构、 三、多维数据模型、 1、星型模式、 2、雪片模式、 3、事实星座、 四、在线分析处理、 五、多维数据分析操作
  • 点击上方“计算机视觉工坊”,选择“星标”干货第一时间送达引言卷积,是卷积神经网络最重要的组件之一。不同的卷积结构有着不一样的功能,但本质上都是用于提取特征。比如,在传统图像处理,人们通...
  • 二维表的表头称为关系模式,表中的内容称为关系实例;同一关系中不允许出现候选码值完全相同的元组 SQL语言的功能有:数据查询、数据操作、数据定义和数据控制,不包括数据存储 关系模型的参照完整性约束中,参照关系...
  • 点击上方“3D视觉工坊”,选择“星标”干货第一时间送达编辑丨机器视觉课堂计算机视觉在智能制造工业检测发挥着检测识别和定位分析的重要作用,为提高工业检测的检测速率和准确率以及智能自动化程度...
  • 十一、数据模型篇—— 事实设计11.1 事实基础11.1.1 事实特性11.1.2 事实设计原则11.1.3 事实的设计准则11.1.4 事实设计方法11.2 事务事实11.2.1 单事务事实11.2.2 多事务事实11.2.3 两种事实比较...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,514
精华内容 3,005
热门标签
关键字:

二维表中的行被称为关系