openMVS icon indicating copy to clipboard operation
openMVS copied to clipboard

A `tutorial` for `colmap` to `openMVS`

Open FavorMylikes opened this issue 2 years ago • 14 comments

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.

FavorMylikes avatar Aug 12 '21 06:08 FavorMylikes

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

cdcseacave avatar Aug 12 '21 06:08 cdcseacave

@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.

FavorMylikes avatar Aug 12 '21 08:08 FavorMylikes

Helps a lot, Thanks!

thomas-graphopti avatar Jul 11 '22 03:07 thomas-graphopti

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"

GraphOpti avatar Aug 23 '22 08:08 GraphOpti

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

shinxg avatar Apr 19 '23 08:04 shinxg

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 avatar Apr 19 '23 08:04 cdcseacave

@FavorMylikes ^

cdcseacave avatar Apr 19 '23 08:04 cdcseacave

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

FavorMylikes avatar Apr 20 '23 12:04 FavorMylikes

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.

citystrawman avatar Feb 09 '24 04:02 citystrawman

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

cdcseacave avatar Feb 09 '24 09:02 cdcseacave

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

citystrawman avatar Feb 10 '24 02:02 citystrawman

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 https://github.com/cdcseacave/openMVS/issues/692#issuecomment-1936829345, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAVMH3QJUS5NU3BSEMMV6TDYS3PBRAVCNFSM5CAJW3R2U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TCOJTGY4DEOJTGQ2Q . You are receiving this because you were mentioned.Message ID: @.***>

cdcseacave avatar Feb 10 '24 09:02 cdcseacave

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)

citystrawman avatar Feb 10 '24 11:02 citystrawman

It is slow in debug, recompile in release

On Sat, Feb 10, 2024 at 13:05 citystrawman @.***> wrote:

Pls see the wiki … <#m_-286968189595765442_> 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) https://github.com/cdcseacave/openMVS/issues/692#issuecomment-1936829345>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAVMH3QJUS5NU3BSEMMV6TDYS3PBRAVCNFSM5CAJW3R2U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TCOJTGY4DEOJTGQ2Q 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) [ @.*** global registry_parallel.impl.hpp:96 cv::parallel::ParallelBackendRegistry::ParallelBackendRegistry core(parallel): Enabled backends(3, sorted by priority): ONETBB(1000); TBB(990); OPENMP(980) [ @.*** 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 [ @.*** global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_onetbb480_64d.dll => FAILED [ @.*** 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 [ @.*** global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_tbb480_64d.dll => FAILED [ @.*** 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 [ @.*** global plugin_loader.impl.hpp:67 cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_openmp480_64d.dll => FAILED Initialized views 33 (100%, 1m14s642ms)

— Reply to this email directly, view it on GitHub https://github.com/cdcseacave/openMVS/issues/692#issuecomment-1936974601, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAVMH3SBO44SQG4D5HTOTYDYS5IAXAVCNFSM5CAJW3R2U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TCOJTGY4TONBWGAYQ . You are receiving this because you were mentioned.Message ID: @.***>

cdcseacave avatar Feb 10 '24 11:02 cdcseacave