Guía: VisualSFM + CMVS/PMVS2 en Linux
Flujo completo de fotogrametría open-source para Linux x86_64
Requisitos
| Componente | Mínimo | Recomendado |
|---|---|---|
| SO | Ubuntu 20.04 x86_64 | Ubuntu 22.04 / 24.04 |
| RAM | 4 GB | 16 GB+ |
| GPU | Cualquiera (CPU fallback) | NVIDIA con CUDA |
| Espacio | 10 GB | 50 GB+ |
| Fotos | 20 imágenes JPG/PNG | 60–150 imágenes |
Nota: VisualSFM usa CUDA si hay una GPU NVIDIA disponible. En CPU puro el proceso es más lento pero funciona.
Instalación rápida
# 1. Dependencias de compilación
sudo apt-get install -y build-essential git wget unzip \
libgtk2.0-dev freeglut3-dev libdevil-dev libglew-dev libglu1-mesa-dev
# 2. Clonar los build scripts (Moult)
git clone --depth=1 https://github.com/Moult/vsfm-linux-x86_64.git ~/VisualSFM
# 3. Descargar fuentes y compilar (~5–15 min)
cd ~/VisualSFM
make
# 4. Crear alias cómodo
echo "alias vsfm='cd ~/VisualSFM && ./visualsfm.sh'" >> ~/.bashrc
source ~/.bashrc
# 5. Abrir VisualSFM
vsfmNota: El repo de Moult es un sistema de build que descarga VisualSFM desde
ccwu.mey compila SiftGPU + PBA localmente. Los binarios quedan en~/VisualSFM/vsfm/bin/. Para lanzarlo siempre usa./visualsfm.shdesde esa carpeta (necesita las libs locales envsfm/bin/).
O usar el script incluido:
chmod +x instalar-vsfm.sh
./instalar-vsfm.shEl workflow paso a paso
Fotos JPG/PNG
│
▼
[PASO 1] VisualSFM — SfM
Detecta puntos SIFT en cada foto
Empareja puntos entre fotos
Calcula posición y orientación de cada cámara
→ genera nube de puntos DISPERSA (.nvm)
│
▼
[PASO 2] CMVS — Clustering
Agrupa las imágenes en subconjuntos manejables
Necesario cuando hay más de ~50 fotos
→ genera estructura de directorios para PMVS2
│
▼
[PASO 3] genOption
Genera el archivo de parámetros para PMVS2
│
▼
[PASO 4] PMVS2 — Multi-View Stereo
Usa los grupos de CMVS para generar
una nube de puntos DENSA
→ genera archivos .ply (nube densa)
│
▼
[PASO 5] MeshLab
Reconstrucción de malla (Poisson)
Limpieza y cierre de agujeros
Texturizado
→ modelo 3D final .obj / .ply / .stl
Uso de la interfaz gráfica (VisualSFM GUI)
1. Cargar imágenes
File → Open+ Multi Images (seleccionar todas las fotos)
Las fotos aparecen en la parte inferior de la pantalla.
2. Detectar y emparejar características
SfM → Pairwise Matching → Compute Missing Match
Equivalente en menú: Ctrl+M
El proceso buscará puntos SIFT en cada imagen y los emparejará. Puede tardar entre 2 y 20 minutos.
3. Reconstruir (SfM)
SfM → Reconstruct Sparse → Reconstruct
Equivalente: Ctrl+R
La interfaz mostrará las cámaras orientadas (pirámides azules) y la nube dispersa.
4. Guardar el proyecto
File → Save NView Match
Guarda el archivo .nvm con todas las posiciones de cámara.
5. Ejecutar CMVS + PMVS2
SfM → Reconstruct Dense → Run CMVS/PMVS
Equivalente: Ctrl+D
VisualSFM ejecutará CMVS y PMVS2 automáticamente. El tiempo varía de 20 minutos a varias horas.
Uso desde la línea de comandos (modo batch)
# Workflow completo en un solo comando
VisualSFM sfm+cmvs /ruta/a/fotos/ proyecto.nvm
# O paso a paso:
# Solo SfM (nube dispersa)
VisualSFM sfm /ruta/a/fotos/*.jpg proyecto.nvm
# CMVS (clustering, necesario si hay >50 fotos)
cmvs proyecto.nvm/ 100 # 100 = máx. imágenes por cluster
# genOption (genera parámetros PMVS2)
genOption proyecto.nvm.cmvs/00/ 1 2 0.7 7 3
# ^nivel ^csize ^threshold ^wsize ^minimage
# PMVS2 (nube densa)
pmvs2 proyecto.nvm.cmvs/00/ option-0000.txtO usar el script incluido:
chmod +x fotogrametria-workflow.sh
./fotogrametria-workflow.sh ./mis_fotos/ nombre_proyectoParámetros clave de PMVS2
| Parámetro | Valor | Efecto |
|---|---|---|
level |
0 |
Máxima resolución (muy lento, mucha RAM) |
level |
1 |
Equilibrio calidad/velocidad (recomendado) |
level |
2 |
Rápido, menor detalle |
csize |
1–4 |
Tamaño de celda de muestreo (menor = más denso) |
threshold |
0.7 |
Consistencia fotométrica (0=permisivo, 1=estricto) |
wsize |
7 |
Ventana de comparación en píxeles |
minimage |
3 |
Mínimo de vistas para aceptar un punto |
Perfil para fósiles pequeños (alta calidad):
genOption carpeta/ 0 1 0.6 7 3Perfil para modelos grandes / poca RAM:
genOption carpeta/ 2 4 0.8 7 4Paso 5: MeshLab (reconstrucción de malla)
Abrir el archivo .ply generado por PMVS2:
File → Import Mesh → seleccionar modelo.ply
Filtros recomendados (en orden)
Limpiar la nube:
Filters → Cleaning and Repairing → Remove Isolated pieces (wrt Face Num.)Reconstruir la malla (Poisson):
Filters → Remeshing → Surface Reconstruction: Screened Poisson Depth: 10–12 (mayor = más detalle, más lento)Cerrar agujeros:
Filters → Remeshing → Close HolesSimplificar (opcional):
Filters → Remeshing → Quadric Edge Collapse Decimation Percentage reduction: 0.5 (reduce a la mitad)Exportar:
File → Export Mesh As → .obj / .ply / .stl
Solución de problemas comunes
VisualSFM no abre / error de librerías
# Verificar librerías faltantes
ldd ~/VisualSFM/VisualSFM | grep "not found"
# Instalar lo que falte
sudo apt-get install -y libgfortran5 libgomp1 libglew2.2 libdevil1c2“CMVS command failed”
- Verificar que
cmvs,pmvs2ygenOptionestén en la misma carpeta queVisualSFM - Verificar permisos:
chmod +x ~/VisualSFM/cmvs ~/VisualSFM/pmvs2
Pocas cámaras orientadas (< 50% de las fotos)
- Las fotos tienen poco traslape → fotografiar con >60% de superposición
- Demasiado movimiento de cámara → mover la cámara en pasos pequeños
- Objeto sin textura → aplicar puntos de referencia (marcadores ArUco)
PMVS2 genera nube muy dispersa
- Bajar
levela0para máxima resolución - Bajar
thresholda0.6 - Aumentar el número de fotos (60–100 para objetos pequeños)
Se cuelga o consume toda la RAM
- Subir
levela2 - Subir
csizea4 - Reducir
CMVS_MAXIMAGEa50 - Cerrar otras aplicaciones
Estructura de archivos de salida
proyecto_output/
├── proyecto.nvm ← posiciones de cámara (SfM)
├── proyecto.nvm.cmvs/
│ └── 00/
│ ├── models/
│ │ └── option-*.ply ← nubes densas por cluster ← RESULTADO
│ ├── txt/ ← parámetros de cámara
│ ├── visualize/ ← imágenes reprocesadas
│ └── option-0000.txt ← parámetros PMVS2
└── workflow.log ← log del proceso (si se usó el script)
Referencias
- VisualSFM (Wu, 2011): http://ccwu.me/vsfm/
- Binarios Linux x86_64 (Moult): https://github.com/Moult/vsfm-linux-x86_64
- CMVS/PMVS2 (Furukawa & Ponce, 2010): https://www.di.ens.fr/pmvs/
- MeshLab: https://www.meshlab.net/
- Tutorial de referencia (Bezděk): https://www.youtube.com/watch?v=v5p8yCZv7j8