Reconstrução por meio de múltiplas perspectivas
Um objeto 3D pode ser reconstruído a partir de múltiplas vistas em 2D. ImageDisplacements é utilizada para determinar a paralaxe de uma vista para outra. Quanto maior o deslocamento de paralaxe, mais próximo está o objeto atrás do pixel correspondente. Com esta informação de profundidade, você pode extrudir os vértices de um objeto de malha obtido através de ImageMesh e TriangulateMesh. O resultado é mostrado através de um mapeamento de textura no objeto de malha em 3D.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_62.png)
Obtenha uma máscara de objeto da imagem central.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_63.png)
mask = Erosion[Binarize[imgs[[2]], 0], 1];
Determine a paralaxe nas imagens da esquerda e da direita em relação ao centro da imagem.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_64.png)
parallaxL = First@ImageDisplacements[imgs[[{2, 1}]]];
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_65.png)
parallaxR = First@ImageDisplacements[imgs[[{2, 3}]]];
Combine estes deslocamentos em um paralaxe total.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_66.png)
parallax = parallaxL - parallaxR;
Em um dado ambiente, o componente da paralaxe é aproximadamente proporcional à profundidade da respectiva fonte de pixel.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_67.png)
depth = Blur@
Opening[ImageMultiply[ImageAdjust@Image[parallax[[All, All, 1]]],
mask], DiskMatrix[4]]
![](assets.pt-br/multi-view-reconstruction/O_29.png)
Construa uma função de profundidade.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_68.png)
depthFunction = ListInterpolation[Transpose@Reverse@ImageData[depth]];
Obtenha um objeto de malha com refinamento que dependa da saliência do objeto.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_69.png)
resolution = ImageAdjust@ImageSaliencyFilter[imgs[[2]]];
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_70.png)
resolutionFunction =
ListInterpolation[Transpose@Reverse@ImageData@resolution];
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_71.png)
\[CapitalOmega] = TriangulateMesh[
ImageMesh[Erosion[mask, DiskMatrix[2]]],
MeshRefinementFunction ->
Function[{vertices, area},
area > 32 + 512 (1 - resolutionFunction @@ Mean[vertices])^6]
]
![](assets.pt-br/multi-view-reconstruction/O_30.png)
Deformação da malha objeto com a função de profundidade.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_72.png)
Graphics3D[
GraphicsComplex[
Apply[{##, depthFunction[##]} &,
MeshCoordinates[\[CapitalOmega]], {1}],
{EdgeForm[], MeshCells[\[CapitalOmega], 2]}
],
PlotRange -> Append[Thread[{0, ImageDimensions[mask]}], {0, 1}],
BoxRatios -> {1, 1, 2/3},
ViewPoint -> Top
]
![](assets.pt-br/multi-view-reconstruction/O_31.png)
Extraia a textura do objeto da imagem central.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_73.png)
texture = SetAlphaChannel[imgs[[2]], mask]
![](assets.pt-br/multi-view-reconstruction/O_32.png)
Mapeie a textura no objeto em 3D.
![Click for copyable input](assets.pt-br/multi-view-reconstruction/In_74.png)
Graphics3D[
{Texture[texture],
GraphicsComplex[
Apply[{##, depthFunction[##]} &,
MeshCoordinates[\[CapitalOmega]], {1}],
{EdgeForm[], MeshCells[\[CapitalOmega], 2]},
VertexTextureCoordinates ->
Map[#/ImageDimensions[texture] &, MeshCoordinates[\[CapitalOmega]]]
]
},
PlotRange -> Append[Thread[{0, ImageDimensions[mask]}], {0, 1}],
BoxRatios -> {1, 1, 2/3},
Lighting -> {{"Ambient", White}},
ViewPoint -> Top,
Boxed -> False
]
![](assets.pt-br/multi-view-reconstruction/swf_7.png)