Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

A tutorial for colmap to openMVS #692

Open
FavorMylikes opened this issue Aug 12, 2021 · 14 comments
Open

A tutorial for colmap to openMVS #692

FavorMylikes opened this issue Aug 12, 2021 · 14 comments

Comments

@FavorMylikes
Copy link

FavorMylikes commented Aug 12, 2021

Through a lot of reading about those doc and issue.

I wanna write a tutorial for fresh people.

This is prepare for linux server (means no desktop)

And I have compile the latest version colmap and openmvs

Step 1

colmap feature_extractor\
--SiftExtraction.use_gpu 0 \
--ImageReader.camera_model PINHOLE \
--database_path $PROJECT/database.db\
--image_path $DATA_ROOT/$PROJECT/images
  • here --SiftExtraction.use_gpu is using for linux server only, you can comment it out if you have desktop.
  • --ImageReader.camera_model PINHOLE, you could choice other one, check the list camera model
  • For using InterfaceCOLMAP, you must specify PINHOLE model

Step 2

colmap exhaustive_matcher\
--SiftMatching.use_gpu 0\
--database_path $PROJECT/database.db
  • here --SiftMatching.use_gpu 0 has same effect with SiftExtraction.use_gpu

Step 3

colmap mapper\
--database_path $PROJECT/database.db \
--image_path $DATA_ROOT/$PROJECT/images \
--output_path $PROJECT/sparse 

Step 4

colmap model_converter \
--input_path $PROJECT/sparse/0 \
--output_path $PROJECT/sparse  \
--output_type TXT
  • Under this step, you will see three txt file will be created at sparse dir.
    • cameras.txt, images.txt, point3D.txt
    • And PINHOLE is in cameras.txt you will see

Step 5

InterfaceCOLMAP \
--working-folder $(pwd)/$PROJECT/ \
--input-file $(pwd)/$PROJECT/ \
--output-file $(pwd)/$PROJECT/model_colmap.mvs

Step 6

DensifyPointCloud \
--input-file $(pwd)/$PROJECT/model_colmap.mvs \
--working-folder $(pwd)/$PROJECT/ \
--output-file $(pwd)/$PROJECT/model_dense.mvs \
--archive-type -1 \
  • Here --archive-type -1 must be set

Step 7

ReconstructMesh --input-file $(pwd)/$PROJECT/model_dense.mvs \
--working-folder $(pwd)/$PROJECT/ \
--output-file $(pwd)/$PROJECT/model_dense_mesh.mvs

Step 8

RefineMesh \
--resolution-level 1 \
--input-file $(pwd)/$PROJECT/model_dense_mesh.mvs \
--working-folder $(pwd)/$PROJECT/ \
--output-file $(pwd)/$PROJECT/model_dense_mesh_refine.mvs

Step 9

TextureMesh \
--export-type obj \
--output-file $(pwd)/$PROJECT/model.obj \
--working-folder $(pwd)/$PROJECT/ \
--input-file $(pwd)/$PROJECT/model_dense_mesh_refine.mvs

FINAL

  • You will get model.mtl model.obj and the texure model_material_0_map_Kd.jpg
  • Open obj with software you like, I'll recommend MAYA

Attantion

  • It is a little bit confusing
  • Unlike other document, I have to delete images path under --working-folder args.
  • I'm not sure if it is a bug.
@cdcseacave
Copy link
Owner

Thanks for putting this tutorial together, but there are some mistakes, like:

  • no need to use PINHOLE in COLMAP, you can use any camera you want (in fact you should use anything but PINHOLE), you only need at the end to run the image undistortion step, that transforms the camera in PINHOLE too.
  • no need to add the full path to all OpenMVS execs like $(pwd)/$PROJECT/, all paths inside OpenMVS are relative to the working folder
  • no need to use --archive-type -1 in DensifyPointCloud

@FavorMylikes
Copy link
Author

@cdcseacave
Thanks for correction.

Update

Step 1

colmap feature_extractor \
--SiftExtraction.use_gpu 0 \
--database_path $PROJECT/database.db\
--image_path $DATA_ROOT/$PROJECT/images

Step 4

Step 4.1

colmap image_undistorter \
--image_path $DATA_ROOT/$PROJECT/images \
--input_path $PROJECT/sparse/0 \
--output_path $PROJECT/dense \
--output_type COLMAP \
  • here --output_type, you could find the usage at colmap

Step 4.2

colmap model_converter \
--input_path $PROJECT/dense/sparse \
--output_path $PROJECT/dense/sparse  \
--output_type TXT
  • Under this step, you will see three txt file will be created at $PROJECT/dense/sparse dir.
  • cameras.txt, images.txt, point3D.txt
  • But you could choice another place to save them.
  • And PINHOLE is in cameras.txt you will see.

Why am I use absolute path $(pwd)

  • InterfaceCOLMAP will check if the path is start with a slash /
  • If not, for example input --input-file $PROJECT/
    • It will search from --working-folder + $PROJECT/
    • For my example, the search path will be $DATA_ROOT/$PROJECT/images/$PROJECT
  • If it is, for example input --input-file /$PROJECT/
    • The search path will be /$PROJECT
  • So I still will use absolute path for me.

@thomas-graphopti
Copy link

Helps a lot, Thanks!

@GraphOpti
Copy link

GraphOpti commented Aug 23, 2022

I combined the command lines into a script. That requires config the $working_folder and $openmvs_bin_path. The images store in the folder $working_folder/images. It will automatically transfer images into textured mode (obj).

#!/bin/bash
working_folder=..../
images_folder=$working_folder/images
database_folder=$working_folder/database.db
output_folder=$working_folder/sparse/
openmvs_bin_path=...../openMVS/build/bin
use_gpu=1
mkdir -p $output_folder
mkdir -p $output_folder/0
echo ">>>>>>>>>>>>>>Starting colmap feature extraction"
colmap feature_extractor \
--SiftExtraction.use_gpu $use_gpu \
--ImageReader.camera_model OPENCV \
--database_path $database_folder \
--image_path $images_folder \
echo ">>>>>>>>>>>>>>Starting colmap exhaustive matching"
colmap exhaustive_matcher \
--SiftMatching.use_gpu $use_gpu \
--database_path $database_folder \
echo ">>>>>>>>>>>>>>Starting colmap mapping"
colmap mapper \
--database_path $database_folder \
--image_path $images_folder \
--output_path $output_folder \
echo "image undistort"
sudo colmap image_undistorter \
--image_path $images_folder \
--input_path $output_folder/0 \
--output_path $working_folder/dense \
--output_type COLMAP \
echo ">>>>>>>>>>>>>>Start colmap model_converter"
colmap model_converter \
--input_path $working_folder/dense/sparse \
--output_path $working_folder/dense/sparse \
--output_type TXT
echo ">>>>>>>>>>>>>>Starting InterfaceCOLMAP"
echo $working_folder/dense
cd $openmvs_bin_path
sudo ./InterfaceCOLMAP \
--working-folder $working_folder \
-i $working_folder/dense/ \
--output-file $working_folder/model_colmap.mvs \
echo ">>>>>>>>>>>>>>>Starting DensifyPointCloud"
echo $working_folder/model_colmap.mvs
cd $openmvs_bin_path
sudo ./DensifyPointCloud \
--input-file $working_folder/model_colmap.mvs \
--working-folder $working_folder \
--output-file $working_folder/model_dense.mvs \
#--archive-type -1\
echo ">>>>>>>>>>>>>>>>Starting ReconstructMesh"
cd $openmvs_bin_path
sudo ./ReconstructMesh \
--input-file $working_folder/model_dense.mvs \
--working-folder $working_folder \
--output-file $working_folder/model_dense_mesh.mvs
echo ">>>>>>>>>>>Refine mesh"
cd $openmvs_bin_path
sudo ./RefineMesh \
--resolution-level 1 \
--input-file $working_folder/model_dense_mesh.mvs \
--working-folder $working_folder \
--output-file $working_folder/model_dense_mesh_refine.mvs
echo ">>>>>>>>>> Texture mesh"
sudo ./TextureMesh \
--export-type obj \
--output-file $working_folder/openmvs_model.obj \
--working-folder $working_folder/ \
--input-file $working_folder/model_dense_mesh_refine.mvs
echo "Finishing script. The final model is locate at"
echo $working_folder
echo "/model.obj"

@shinxg
Copy link

shinxg commented Apr 19, 2023

Through a lot of reading about those doc and issue.

I wanna write a tutorial for fresh people.

This is prepare for linux server (means no desktop)

And I have compile the latest version colmap and openmvs

Step 1

colmap feature_extractor\
--SiftExtraction.use_gpu 0 \
--ImageReader.camera_model PINHOLE \
--database_path $PROJECT/database.db\
--image_path $DATA_ROOT/$PROJECT/images
  • here --SiftExtraction.use_gpu is using for linux server only, you can comment it out if you have desktop.
  • --ImageReader.camera_model PINHOLE, you could choice other one, check the list camera model
  • For using InterfaceCOLMAP, you must specify PINHOLE model

Step 2

colmap exhaustive_matcher\
--SiftMatching.use_gpu 0\
--database_path $PROJECT/database.db
  • here --SiftMatching.use_gpu 0 has same effect with SiftExtraction.use_gpu

Step 3

colmap mapper\
--database_path $PROJECT/database.db \
--image_path $DATA_ROOT/$PROJECT/images \
--output_path $PROJECT/sparse 

Step 4

colmap model_converter \
--input_path $PROJECT/sparse/0 \
--output_path $PROJECT/sparse  \
--output_type TXT
  • Under this step, you will see three txt file will be created at sparse dir.

    • cameras.txt, images.txt, point3D.txt
    • And PINHOLE is in cameras.txt you will see

Step 5

InterfaceCOLMAP \
--working-folder $(pwd)/$PROJECT/ \
--input-file $(pwd)/$PROJECT/ \
--output-file $(pwd)/$PROJECT/model_colmap.mvs

Step 6

DensifyPointCloud \
--input-file $(pwd)/$PROJECT/model_colmap.mvs \
--working-folder $(pwd)/$PROJECT/ \
--output-file $(pwd)/$PROJECT/model_dense.mvs \
--archive-type -1 \
  • Here --archive-type -1 must be set

Step 7

ReconstructMesh --input-file $(pwd)/$PROJECT/model_dense.mvs \
--working-folder $(pwd)/$PROJECT/ \
--output-file $(pwd)/$PROJECT/model_dense_mesh.mvs

Step 8

RefineMesh \
--resolution-level 1 \
--input-file $(pwd)/$PROJECT/model_dense_mesh.mvs \
--working-folder $(pwd)/$PROJECT/ \
--output-file $(pwd)/$PROJECT/model_dense_mesh_refine.mvs

Step 9

TextureMesh \
--export-type obj \
--output-file $(pwd)/$PROJECT/model.obj \
--working-folder $(pwd)/$PROJECT/ \
--input-file $(pwd)/$PROJECT/model_dense_mesh_refine.mvs

FINAL

  • You will get model.mtl model.obj and the texure model_material_0_map_Kd.jpg
  • Open obj with software you like, I'll recommend MAYA

Attantion

  • It is a little bit confusing
  • Unlike other document, I have to delete images path under --working-folder args.
  • I'm not sure if it is a bug.

Does this support --mask-path option in the DensifyPointCloud process?
I tried with the following commands with --mask-path and without --mask-path and found that there is no difference in the output pointcloud file:
./bin/DensifyPointCloud --input-file /data1/wutong/Ali_Data/3D/fila_my1/model_colmap.mvs --working-folder /data1/wutong/Ali_Data/3D/fila_my1 --output-file /data1/wutong/Ali_Data/3D/fila_my1/model_dense.mvs --archive-type -1 --mask-path /data1/wutong/Ali_Data/3D/fila_my1/masks --ignore-mask-label 0 --filter-point-cloud 1

./bin/DensifyPointCloud --input-file /data1/wutong/Ali_Data/3D/fila_my1/model_colmap.mvs --working-folder /data1/wutong/Ali_Data/3D/fila_my1 --output-file /data1/wutong/Ali_Data/3D/fila_my1/model_dense.mvs --archive-type -1

@cdcseacave
Copy link
Owner

great tutorial, thank you!
could you pls modify the MvgMvsPipeline.py script to add COLMAP steps as additional steps in the script so that newcomers can run just one script that does both COLMAP and OpenMVS reconstruction?

@cdcseacave
Copy link
Owner

@FavorMylikes ^

@FavorMylikes
Copy link
Author

@cdcseacave All right, I'm very glad to do this

@citystrawman
Copy link

Hi, thank you for this great pipeline tutorial! I am trying to reallize this pipeline on my computer but at step 7, the ReconstructMesh , I just can't get the .mvs file. It is strange because after execute the program, I can get model_dense_mesh.mlp as well as model_dense_mesh.ply, the only file that I do not get is the mvs file.
Do you have any idea of this problem? Thank you.

@cdcseacave
Copy link
Owner

you do not need the MVS file for the mesh stage, use the same MVS file

@citystrawman
Copy link

citystrawman commented Feb 10, 2024

you do not need the MVS file for the mesh stage, use the same MVS file

Hi, I tried to use the old mvs file (model_dense.mvs that is generated in step 6) for step8(RefineMesh) as well as step9(TextureMesh), but both of the two give error saying "error: invalid mesh file, cannot load mesh file". I am not sure what is going wrong.

ps: my script is as follows:

 echo ==================Refine mesh==================
 RefineMesh.exe ^
 --resolution-level 1 ^
 --input-file E:\sfm_mvs_pipeline_test\project\model_dense.mvs ^
 --working-folder E:\sfm_mvs_pipeline_test\project ^
 --output-file E:\sfm_mvs_pipeline_test\project\model_dense_mesh_refine.mvs
 echo ==================Texture mesh==================
TextureMesh.exe ^
 --export-type obj ^
 --output-file E:\sfm_mvs_pipeline_test\project\openmvs_model.obj ^
 --working-folder E:\sfm_mvs_pipeline_test\project ^
 --input-file E:\sfm_mvs_pipeline_test\project\model_dense.mvs

@cdcseacave
Copy link
Owner

cdcseacave commented Feb 10, 2024 via email

@citystrawman
Copy link

Pls see the wiki

On Sat, Feb 10, 2024 at 04:59 citystrawman @.> wrote: you do not need the MVS file for the mesh stage, use the same MVS file Hi, I tried to use the old mvs file (model_dense.mvs that is generated in step 6) for step8(RefineMesh) as well as step9(TextureMesh), but neither of the two give error saying "error: invalid mesh file, cannot load mesh file". I am not sure what is going wrong. — Reply to this email directly, view it on GitHub <#692 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAVMH3QJUS5NU3BSEMMV6TDYS3PBRAVCNFSM5CAJW3R2U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TCOJTGY4DEOJTGQ2Q . You are receiving this because you were mentioned.Message ID: @.>

Thank you. Now I ran code like this: TextureMesh model_dense.mvs -m model_dense_mesh.ply -o model_texture.mvs , and it does not report errors; however, it shows that some library failed load, and now the program just stuck at "Initialized views" for hours. Here's the last lines that I copied :

17:47:59 [App     ] Mesh loaded: 520355 vertices, 1040677 faces (467ms)
[ INFO:[email protected]] global registry_parallel.impl.hpp:96 cv::parallel::ParallelBackendRegistry::ParallelBackendRegistry core(parallel): Enabled backends(3, sorted by priority): ONETBB(1000); TBB(990); OPENMP(980)
[ INFO:[email protected]] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load D:\programs\openMVS\make\bin\vc16\x64\Debug\opencv_core_parallel_onetbb480_64d.dll => FAILED
[ INFO:[email protected]] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_onetbb480_64d.dll => FAILED
[ INFO:[email protected]] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load D:\programs\openMVS\make\bin\vc16\x64\Debug\opencv_core_parallel_tbb480_64d.dll => FAILED
[ INFO:[email protected]] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_tbb480_64d.dll => FAILED
[ INFO:[email protected]] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load D:\programs\openMVS\make\bin\vc16\x64\Debug\opencv_core_parallel_openmp480_64d.dll => FAILED
[ INFO:[email protected]] global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_openmp480_64d.dll => FAILED
Initialized views 33 (100%, 1m14s642ms)

@cdcseacave
Copy link
Owner

cdcseacave commented Feb 10, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants