恢复室内布局,传统方法主要分为3个步骤:线段检测和估计消失点、生成布局假设、对假设进行打分,方向图可以作为布局打分重要部分。
墙角分为3类:
凸角convex(+)corners.
凹角concave(-)corners.
遮挡角occluding(>)corners.
所有房间布局可由这3种基本类别进行组合。
进一步根据消失点划分3个区域(视角不同),每个区域只有凸角、凹角、遮挡角1、遮挡角2,这4种类型的墙角
所以在进行线段检测和消失点估计后,先寻找一对平行线段(在3D空间,在透视图中是交于同一消失点的线段),判断其所在区域,检测对是否存在其区域中的4种类墙角。
约束: 对于4种类型的交,各自最少需要检测到3、3、4、4条线段才能确定
最后得到布局集合: H ← H 0 ∪ H 1 ∪ ⋯ ∪ H n H \leftarrow H_{0} \cup H_{1} \cup \cdots \cup H_{n} H←H0∪H1∪⋯∪Hn
一个点如果由2个不同方向的线段支持,比如上图(1)中的点,由2个方向(绿、蓝)支持,所以(1)中的点的方向垂直于绿、蓝。
(2)中的点,由2个方向(红、绿)支持,所以(2)中的点的方向垂直于红、绿线。上下的蓝线被绿线阻挡,绿线。右边的蓝线被红线阻挡,所以不能作为(2)中点的支持方向。
区域扫描(sweep)过程:
比如有在x方向的线段集合: L x = { l x , 1 , l x , 2 , ⋯ , l x , n x } L_{x}=\left\{l_{x, 1}, l_{x, 2}, \cdots, l_{x, n_{x}}\right\} Lx={lx,1,lx,2,⋯,lx,nx},其中 x ∈ { 1 , 2 , 3 } x \in\{1,2,3\} x∈{1,2,3}表示3个方向。
定义: S ( l x , i , v y , α ) S\left(l_{x, i}, v_{y}, \alpha\right) S(lx,i,vy,α),表示从x方向的第i条线段 l x , i l_{x, i} lx,i朝着消失点y前进 α \alpha α得到的凸多边形,其中线段 l x , i l_{x, i} lx,i所在消失点方向和扫描方向垂直,如下图
线段 l l l的消失点为x方向,扫描方向为y方向,它们是垂直关系( x ≠ y , x ≠ z , y ≠ z x \neq y, x \neq z, y \neq z x=y,x=z,y=z), S ( l , v y , α ) S\left(l, v_{y}, \alpha\right) S(l,vy,α)由4个点组成,分别是线段 l l l的端点 p 1 , p 2 p_{1}, p_{2} p1,p2, p 1 ′ , p_{1}^{\prime}, p1′, 和 p 2 ′ p_{2}^{\prime} p2′通过
p 1 ′ = p 1 + α ( v y − p 1 ) p 2 ′ = i n t e r s e c t i o n ( line ( v x , p 1 ′ ) , line ( v y , p 2 ) ) p_{1}^{\prime}=p_{1}+\alpha\left(v_{y}-p_{1}\right)\\ p_{2}^{\prime}=i n t e r s e c t i o n\left(\operatorname{line}\left(v_{x}, p_{1}^{\prime}\right), \operatorname{line}\left(v_{y}, p_{2}\right)\right) p1′=p1+α(vy−p1)p2′=intersection(line(vx,p1′),line(vy,p2))
扫描过程直到遇到垂直于x和y方向平面的线段停止。扫描有分向前量 α ^ x , i \widehat{\alpha}_{x, i} α x,i和向后量 − β ^ x , i -\widehat{\beta}_{x, i} −β x,i,都最大化它们:
α ^ x , i = max ( α ) , β ^ x , i = max ( β ) \widehat{\alpha}_{x, i}=\max (\alpha), \widehat{\beta}_{x, i}=\max (\beta) α x,i=max(α),β x,i=max(β)
所以有 S ( l x , i , v y , α ) S\left(l_{x, i}, v_{y}, \alpha\right) S(lx,i,vy,α)和 S ( l x , i , v y , − β ) S\left(l_{x, i}, v_{y},-\beta\right) S(lx,i,vy,−β),其中 α ≥ 0 , β ≥ 0 \alpha \geq 0, \beta \geq 0 α≥0,β≥0,不会和z方向上的线段 L z L_{z} Lz有交点。
一个像素集合,表示的是 x x x方向上线段集合 L x L_{x} Lx,朝向消失点 y y y,方向为 z z z,如下描述:
P x , y , z = ⋃ l x , i ∈ L x S ( l x , i , v y , α ^ x , i ) ∪ S ( l x , i , v y , β ^ x , i ) P_{x, y, z}=\bigcup_{l_{x, i} \in L_{x}} S\left(l_{x, i}, v_{y}, \widehat{\alpha}_{x, i}\right) \cup S\left(l_{x, i}, v_{y}, \widehat{\beta}_{x, i}\right) Px,y,z=lx,i∈Lx⋃S(lx,i,vy,α x,i)∪S(lx,i,vy,β x,i)
为了确保map的唯一性和准确性,同一平面上,比如xy平面朝着2个消失点方向x和y都能得到对应扫描区域,都表示该区域方向为z,取交集:
R z = P x , y , z ∩ P y , x , z R_{z}=P_{x, y, z} \cap P_{y, x, z} Rz=Px,y,z∩Py,x,z
为了确保方向唯一性,只有唯一属于一个方向的扫描区域可以接受:
O z = R z ∩ R x c ∩ R y c O_{z}=R_{z} \cap R_{x}^{c} \cap R_{y}^{c} Oz=Rz∩Rxc∩Ryc
下图显示了 O 1 , O 2 , O 3 O_{1}, O_{2}, O_{3} O1,O2,O3