-
-
Save polyfjord/4ed7e8988bdb9674145f1c270440200d to your computer and use it in GitHub Desktop.
| :: ================================================================ | |
| :: BATCH SCRIPT FOR AUTOMATED PHOTOGRAMMETRY TRACKING WORKFLOW | |
| :: By polyfjord - https://youtube.com/polyfjord | |
| :: ================================================================ | |
| :: USAGE | |
| :: • Double-click this .bat or run it from a command prompt. | |
| :: • Frames are extracted, features matched, and a sparse | |
| :: reconstruction is produced automatically. | |
| :: • Videos that have already been processed are skipped on | |
| :: subsequent runs. | |
| :: | |
| :: PURPOSE | |
| :: This is a fully automated photogrammetry tracker for turning | |
| :: videos into COLMAP sparse models with robust error handling, | |
| :: clean directory setup, and clear ✖ / ✔ logging. | |
| :: | |
| :: FOLDER LAYOUT (all folders sit side-by-side): | |
| :: 01 COLMAP – Download the latest release from | |
| :: https://github.com/colmap/colmap | |
| :: and place colmap.bat (plus its dlls) here. | |
| :: | |
| :: 02 VIDEOS – Put your input video files (.mp4, .mov, …) here. | |
| :: All framerates and aspect ratios are supported. | |
| :: | |
| :: 03 FFMPEG – Drop a **static build** of FFmpeg | |
| :: (either ffmpeg.exe or bin\ffmpeg.exe) here. | |
| :: | |
| :: 04 SCENES – The script creates one sub-folder per video | |
| :: containing extracted frames, the COLMAP | |
| :: database, sparse model, and TXT export. | |
| :: | |
| :: 05 SCRIPTS – This batch file lives here. | |
| :: | |
| :: ================================================================ | |
| @echo off | |
| :: ---------- Resolve top-level folder (one up from this .bat) ----- | |
| pushd "%~dp0\.." >nul | |
| set "TOP=%cd%" | |
| popd >nul | |
| :: ---------- Key paths ------------------------------------------- | |
| set "COLMAP_DIR=%TOP%\01 COLMAP" | |
| set "VIDEOS_DIR=%TOP%\02 VIDEOS" | |
| set "FFMPEG_DIR=%TOP%\03 FFMPEG" | |
| set "SCENES_DIR=%TOP%\04 SCENES" | |
| :: ---------- Locate ffmpeg.exe ----------------------------------- | |
| if exist "%FFMPEG_DIR%\ffmpeg.exe" ( | |
| set "FFMPEG=%FFMPEG_DIR%\ffmpeg.exe" | |
| ) else if exist "%FFMPEG_DIR%\bin\ffmpeg.exe" ( | |
| set "FFMPEG=%FFMPEG_DIR%\bin\ffmpeg.exe" | |
| ) else ( | |
| echo [ERROR] ffmpeg.exe not found inside "%FFMPEG_DIR%". | |
| pause & goto :eof | |
| ) | |
| :: ---------- Locate colmap.exe (skip the .bat) -------------------- | |
| if exist "%COLMAP_DIR%\colmap.exe" ( | |
| set "COLMAP=%COLMAP_DIR%\colmap.exe" | |
| ) else if exist "%COLMAP_DIR%\bin\colmap.exe" ( | |
| set "COLMAP=%COLMAP_DIR%\bin\colmap.exe" | |
| ) else ( | |
| echo [ERROR] colmap.exe not found inside "%COLMAP_DIR%". | |
| pause & goto :eof | |
| ) | |
| :: ---------- Put COLMAP’s dll folder(s) on PATH ------------------- | |
| set "PATH=%COLMAP_DIR%;%COLMAP_DIR%\bin;%PATH%" | |
| :: ---------- Ensure required folders exist ------------------------ | |
| if not exist "%VIDEOS_DIR%" ( | |
| echo [ERROR] Input folder "%VIDEOS_DIR%" missing. | |
| pause & goto :eof | |
| ) | |
| if not exist "%SCENES_DIR%" mkdir "%SCENES_DIR%" | |
| :: ---------- Count videos for progress bar ------------------------ | |
| for /f %%C in ('dir /b /a-d "%VIDEOS_DIR%\*" ^| find /c /v ""') do set "TOTAL=%%C" | |
| if "%TOTAL%"=="0" ( | |
| echo [INFO] No video files found in "%VIDEOS_DIR%". | |
| pause & goto :eof | |
| ) | |
| echo ============================================================== | |
| echo Starting COLMAP on %TOTAL% video(s) … | |
| echo ============================================================== | |
| setlocal EnableDelayedExpansion | |
| set /a IDX=0 | |
| for %%V in ("%VIDEOS_DIR%\*.*") do ( | |
| if exist "%%~fV" ( | |
| set /a IDX+=1 | |
| call :PROCESS_VIDEO "%%~fV" "!IDX!" "%TOTAL%" | |
| ) | |
| ) | |
| echo -------------------------------------------------------------- | |
| echo All jobs finished – results are in "%SCENES_DIR%". | |
| echo -------------------------------------------------------------- | |
| pause | |
| goto :eof | |
| :PROCESS_VIDEO | |
| :: ---------------------------------------------------------------- | |
| :: %1 = full path to video %2 = current index %3 = total | |
| :: ---------------------------------------------------------------- | |
| setlocal | |
| set "VIDEO=%~1" | |
| set "NUM=%~2" | |
| set "TOT=%~3" | |
| for %%I in ("%VIDEO%") do ( | |
| set "BASE=%%~nI" | |
| set "EXT=%%~xI" | |
| ) | |
| echo. | |
| echo [!NUM!/!TOT!] === Processing "!BASE!!EXT!" === | |
| :: -------- Directory layout for this scene ----------------------- | |
| set "SCENE=%SCENES_DIR%\!BASE!" | |
| set "IMG_DIR=!SCENE!\images" | |
| set "SPARSE_DIR=!SCENE!\sparse" | |
| :: -------- Skip if already reconstructed ------------------------- | |
| if exist "!SCENE!" ( | |
| echo ↻ Skipping "!BASE!" – already reconstructed. | |
| goto :END | |
| ) | |
| :: Clean slate ---------------------------------------------------- | |
| mkdir "!IMG_DIR!" >nul | |
| mkdir "!SPARSE_DIR!" >nul | |
| :: -------- 1) Extract every frame -------------------------------- | |
| echo [1/4] Extracting frames … | |
| "%FFMPEG%" -loglevel error -stats -i "!VIDEO!" -qscale:v 2 ^ | |
| "!IMG_DIR!\frame_%%06d.jpg" | |
| if errorlevel 1 ( | |
| echo ✖ FFmpeg failed – skipping "!BASE!". | |
| goto :END | |
| ) | |
| :: Check at least one frame exists | |
| dir /b "!IMG_DIR!\*.jpg" >nul 2>&1 || ( | |
| echo ✖ No frames extracted – skipping "!BASE!". | |
| goto :END | |
| ) | |
| :: -------- 2) Feature extraction --------------------------------- | |
| echo [2/4] COLMAP feature_extractor … | |
| "%COLMAP%" feature_extractor ^ | |
| --database_path "!SCENE!\database.db" ^ | |
| --image_path "!IMG_DIR!" ^ | |
| --ImageReader.single_camera 1 ^ | |
| --SiftExtraction.use_gpu 1 ^ | |
| --SiftExtraction.max_image_size 4096 | |
| if errorlevel 1 ( | |
| echo ✖ feature_extractor failed – skipping "!BASE!". | |
| goto :END | |
| ) | |
| :: -------- 3) Sequential matching -------------------------------- | |
| echo [3/4] COLMAP sequential_matcher … | |
| "%COLMAP%" sequential_matcher ^ | |
| --database_path "!SCENE!\database.db" ^ | |
| --SequentialMatching.overlap 15 | |
| if errorlevel 1 ( | |
| echo ✖ sequential_matcher failed – skipping "!BASE!". | |
| goto :END | |
| ) | |
| :: -------- 4) Sparse reconstruction ------------------------------ | |
| echo [4/4] COLMAP mapper … | |
| "%COLMAP%" mapper ^ | |
| --database_path "!SCENE!\database.db" ^ | |
| --image_path "!IMG_DIR!" ^ | |
| --output_path "!SPARSE_DIR!" ^ | |
| --Mapper.num_threads %NUMBER_OF_PROCESSORS% | |
| if errorlevel 1 ( | |
| echo ✖ mapper failed – skipping "!BASE!". | |
| goto :END | |
| ) | |
| :: -------- Export best model to TXT ------------------------------ | |
| if exist "!SPARSE_DIR!\0" ( | |
| "%COLMAP%" model_converter ^ | |
| --input_path "!SPARSE_DIR!\0" ^ | |
| --output_path "!SPARSE_DIR!" ^ | |
| --output_type TXT >nul | |
| ) | |
| echo ✔ Finished "!BASE!" (!NUM!/!TOT!) | |
| :END | |
| endlocal & goto :eof |
this script has a file encoding problem.
On my win10 22H2 Chinese system, you have to save the bat in ANSI coding manually to run the script or you'll get piles of errors
wonderful automatical script anyway
Hello, guys. Help me please. When i push ctrl+s and choose all files , it saves text file, not this one with little gears on thumbnail, so when i push to launch , it just open text file...
@topazonanton, click the 'raw' button first (top right of script), then use ctrl+s
@PhoenixIllusion, your notes were very important in running in headless mode. I ran Debian 13 and found the following (found out later that this is because I was running an older version):
- You can install everything with the following code:
sudo apt-get install ffmpeg colmap -y# Don't follow this, follow the guide below. - Found the .use_gpu you use is wrong or out of date. I found these to work:
- $COLMAP feature_extractor --SiftExtraction.use_gpu 0 # Find and change
$COLMAP sequential_matcher --SiftMatching.use_gpu 0 # Add this
- $COLMAP feature_extractor --SiftExtraction.use_gpu 0 # Find and change
I got a whole guide here: AutoTracker_v1.4_Linux.sh
@PhoenixIllusion Thank you.
But i already solve this problem. Its was about saving the file. It was saving file as text file and letters txt were invisible by some reason...
So when i just removed few last letters and typed the again file became *.bat as needed.
Thank you again. I already made my first track using glomap, it works really cool)))
If to compare AfterEffects tracking with glomap, there is one negative thing in glomap , it doesnt connect fixed plane to tracked dots, but its not a big problem. It still works greate!!!
I had the same issue, added the following line to the script after line 70 (After the "Put COLMAP’s dll folder(s) on PATH"):
set "QT_PLUGIN_PATH=%COLMAP_DIR%\plugins"This resolved the qt issue for me, it was suggested in the colmap issues: colmap/colmap#475