Encontrei dois sites interessantes sobre o uso do software VisualSFM para reconstrução de objetos em 3D (Scanner 3D) usando apenas fotos de vários ângulos do objeto desejado.
Neste site você encontra o passo-a-passo de como usar o software:
http://wedidstuff.heavyimage.com/index.php/2013/07/12/open-source-photogrammetry-workflow/
O detalhe é que este software não é muito simples de instalar, mas felizmente existe um tutorial bem explicativo:
http://www.10flow.com/2012/08/15/building-visualsfm-on-ubuntu-12-04-precise-pangolin-desktop-64-bit/
Durante a compilação tive que instalar várias dependências para finalizar corretamente.
O comando “history” ajuda na hora de documentar quais pacotes você deve instalar:
sudo apt-get install libjpeg62 sudo apt-get install libgtkgl2.0-dev sudo apt-get install libglu1-mesa-dev sudo apt-get install libc6-dev-i386 libhdf5-serial-dev libgtest-dev libgsl0-dev python-dev cmake imagemagick libmagick++-dev gfortran minpack-dev liblapack-dev libatlas-dev libatlas-base-dev libboost-dev libc6-dev-i386 libgsl0-dev sudo apt-get install libglew-dev sudo apt-get install libilmbase-dev sudo apt-get install freeglut3 freeglut3-dev sudo apt-get install libdevil1c2 libdevil-dev sudo apt-get install linux-libc-dev sudo apt-get install nvidia-cuda-dev sudo apt-get install nvidia-cuda-toolkit
Esta foi a ordem de instalação dos pacotes, mas claro que você pode juntar todos os comandos acima num único comando.
Quando terminar a compilação e você adicionar os comandos no seu .bashrc (PATH e LD_LIBRARY_PATH para que o VisualSFM funcione de qualquer lugar que for chamado), basta seguir o tutorial do primeiro link e executar o comando:
$ VisualSFM
Este é o log que o programa exibiu no terminal durante o processo de reconstrução 3D:
$ VisualSFM ERROR: CUDA is unlikely to be supported! CPU single-precisoin solver; 4 cores. CPU single-precisoin solver; 4 cores. WARNING: 78 points are behind camras. WARNING: 5 points are behind camras. WARNING: 12 points are behind camras. WARNING: 1 camera moved to avoid degeneracy. WARNING: 103 points are behind camras. WARNING: 1 camera moved to avoid degeneracy. WARNING: 53 points are behind camras. WARNING: 150 points are behind camras. WARNING: 50 points are behind camras. WARNING: 8 points are behind camras. WARNING: 2 points are behind camras. WARNING: 1 camera moved to avoid degeneracy. WARNING: 4 points are behind camras. WARNING: 50 points are behind camras. WARNING: 105 points are behind camras. WARNING: 1 camera moved to avoid degeneracy. WARNING: 14 points are behind camras. WARNING: 9 points are behind camras. Reading bundle...23 cameras -- 11366 points in bundle file *********** 23 cameras -- 11366 points Reading images: *********************** Set widths/heights...done 0 secs done 0 secs slimNeighborsSetLinks...done 0 secs mergeSFM...***********resetPoints...done Rep counts: 11366 -> 1506 1 secs setScoreThresholds...done 0 secs sRemoveImages... ************ Kept: 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 Removed: 0 3 18 21 22 sRemoveImages: 23 -> 18 0 secs slimNeighborsSetLinks...done 0 secs Cluster sizes: 18 Adding images: 0 Image nums: 23 -> 18 -> 18 Divide: done 0 secs 17 images in vis on the average -------------------------------------------------- --- Summary of specified options --- # of timages: 18 (enumeration) # of oimages: 0 (enumeration) level: 1 csize: 2 threshold: 0 wsize: 7 minImageNum: 3 CPU: 4 useVisData: 1 sequence: -1 -------------------------------------------------- Reading images: ****************** 1 2 4 5 Harris running ...Harris running ...Harris running ...Harris running ...7867 harris done DoG running...7524 harris done DoG running...7780 harris done DoG running...7660 harris done DoG running...11841 dog done 11453 dog done 6 Harris running ...7 Harris running ...11371 dog done 8 Harris running ...11590 dog done 9 Harris running ...7937 harris done 7873 harris done DoG running...DoG running...7859 harris done DoG running...7888 harris done DoG running...11831 dog done 10 Harris running ...11814 dog done 11 Harris running ...11796 dog done 12 Harris running ...11569 dog done 13 Harris running ...7810 harris done DoG running...7867 harris done DoG running...7885 harris done DoG running...7976 harris done DoG running...11664 dog done 14 Harris running ...11555 dog done 15 Harris running ...11503 dog done 16 Harris running ...11492 dog done 17 Harris running ...7889 harris done DoG running...7937 harris done DoG running...8039 harris done DoG running...7674 harris done DoG running...11815 dog done 19 Harris running ...11658 dog done 20 Harris running ...11534 dog done 11786 dog done 7956 harris done DoG running...7812 harris done DoG running...11619 dog done 11648 dog done done adding seeds (4,14112)(15,14826)(11,11580)(10,17663)(16,6016)(14,8447)(6,1015)(3,0)(7,0)(8,0)(2,5)(9,303)(12,302)(0,1446)(5,234)(13,7)(17,3265)(1,4141)done ---- Initial: 0 secs ---- Total pass fail0 fail1 refinepatch: 420784 160226 234044 26514 186740 Total pass fail0 fail1 refinepatch: 100 38.078 55.6209 6.3011 44.3791 Expanding patches... ---- EXPANSION: 3623 secs ---- Total pass fail0 fail1 refinepatch: 1870144 1707366 90931 71847 1779213 Total pass fail0 fail1 refinepatch: 100 91.296 4.86225 3.84179 95.1377 FilterOutside mainbody: Gain (ave/var): 3.43597 4.34296 1790691 -> 1400840 (78.229%) 0 secs Filter Exact: ****************** 1400840 -> 1069251 (76.3293%) 0 secs FilterNeighbor: 1069251 -> 861199 (80.5423%) 0 secs FilterGroups: 86 861199 -> 731982 (84.9957%) 0 secs STATUS: 63493 0 1902422 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Expanding patches... ---- EXPANSION: 6473 secs ---- Total pass fail0 fail1 refinepatch: 1614281 809529 225725 579027 1388556 Total pass fail0 fail1 refinepatch: 100 50.148 13.983 35.869 86.017 FilterOutside mainbody: Gain (ave/var): 4.72691 4.08953 1541511 -> 1495754 (97.0317%) 0 secs Filter Exact: ****************** 1495754 -> 1089231 (72.8215%) 0 secs FilterNeighbor: 1089231 -> 1005671 (92.3285%) 0 secs FilterGroups: 100 1005671 -> 910438 (90.5304%) 0 secs STATUS: 107343 0 3247058 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Expanding patches... ---- EXPANSION: 7093 secs ---- Total pass fail0 fail1 refinepatch: 1477285 717982 219394 539909 1257891 Total pass fail0 fail1 refinepatch: 100 48.6015 14.8512 36.5474 85.1488 FilterOutside mainbody: Gain (ave/var): 4.80507 4.23908 1628420 -> 1578352 (96.9254%) 0 secs Filter Exact: ****************** 1578352 -> 1134779 (71.8964%) 0 secs FilterNeighbor: 1134779 -> 1058326 (93.2627%) 0 secs FilterGroups: 105 1058326 -> 962984 (90.9912%) 0 secs STATUS: 148417 0 4463834 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Observe no log acima que a primeira “EXPANSION” demorou quase 1 hora e as duas seguintes demoraram quase 2 horas cada.
Eu comecei os testes no início da tarde de ontem e deixei o computador ligado a noite terminando a conversão. A última vez que olhei há quanto tempo o programa VisualSFM estava rodando (usando o etime do comando ps) já havia se passado 10 horas.
É importante lembrar que usei um notebook modesto: Intel® Core™ i3-3227U (1.9GHz, 4 Threads, 3Mb Cache, Placa de vídeo Intel HD Graphics) sem suporte a CUDA. Vou refazer o teste usando o outro notebook que tem uma configuração um pouco melhor (Core i7 com placa de vídeo NVIDIA e com suporte CUDA) para ver se o tempo de processamento diminuirá muito.
Seguem abaixo alguns screenshots e alguns comentários:
Neste primeiro teste eu não preocupei com alguns detalhes: número reduzido de fotos para processamento (23 fotos); nem todos os lados do objeto foram fotografados suficientemente, note nas fotos acima que o lado esquerdo do Mario foi fotografado aprox. 10 fotos, enquando o lado direito e traseiro foram muito pouco fotografados; não preocupei em corrigir os avisos de advertência do software sobre a posição da camera, etc.
Após rodar o comando para computar os pontos que estão faltando e computar a reconstrução 3D o programa gera um nuvem de pontos com as informações colhidas das fotos:
E finalmente o resultado de aproximadamente 15 horas de processamento após executar o “Dense Reconstruction” (botão CMVS) :
Para alternar entre o modo visualização 3D e nuvem de pontos basta pressionar a tecla TAB.
Apesar do resultado inicial não ser o eu esperava, fiquei surpreso com o nível de detalhes da parte reconstruída, já que o boneco Mario usado neste teste era muito pequeno, aprox. 4cm de altura.
Para um resultado melhor seria interessante usar uma plataforma giratória onde o objeto seria fixado e as fotos seriam tiradas em ângulos bem definidos. Nesta plataforma a altura da camera seria reajustada após obter as fotos de 360º do objeto.
Ficou muito estranho, Alan. Tentou com fundo branco e local adequadamente iluminado, sem spots de luz ? Note que muito do erro veio disso.
O problema foi exatamente a iluminação não uniforme e poucas fotos em alguns ângulos, o ideal é que o fundo tenha padrões mesmo. Neste tutorial ele sugere colocar o objeto sobre um jornal: https://www.youtube.com/watch?v=NsBg-m2hrIM
Pessoal, estou tendo problema na visualização da nuvem densa, pois depois de salvar e ser processada, aplico o comando peço para visualizar e não aparece nada. Alguém tem alguma dica? Obrigado!
Será que tem alguma coisa a ver com o pacote CMVS/PMVS? Como resolver?