@echo Script pour utilisation de MicMac sous windows @echo v0.022 - 07/09/2016 @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "Choix des paramètres" @echo "---------------------------------------------------" @echo "---------------------------------------------------" :: Répertoires des programmes : set "BIN_DIR=C:/MicMac64bits6706/bin" & REM Executables MicMac set "BINAUX_DIR=C:/MicMac64bits6706/binaire-aux/windows" & REM Executables programmes auxilliaires MicMac= set "MESHLAB=C:/Program Files/VCG/MeshLab/meshlab.exe" & REM Executables Meshlab (visualisation nuages de points) :: Répertoires du projet set "WORKING_DIR=C:/micmac_data/zTry3" & REM Répertoire de travail où se trouvent les photos set "MMIMG_SUBDIR=MM-Malt-Img-" & REM Préfixe des répertoire temporaires de traitement chaque image maitresse set "RESULT_SUBDIR=_Result" & REM Répertoire où seront enregistrés les résultats finaux (nuages de points, cartes de profondeurs) :: Noms des images pour la création du nuage de point, utilisant une expression régulière set "P_A=A_DSC[0-9]{5}.JPG" set "P_B=B_DSC[0-9]{5}.JPG" set "P_C=C_DSC[0-9]{5}.JPG" set "P_ALL=._DSC[0-9]{5}.JPG" :: Autres - ne pas modifier set "SH=SH=""" & REM Suffixe par défaut pour Tapas, Campari, Apericloud etc. set "MMIMG_DIR=%WORKING_DIR%/%MMIMG_SUBDIR%" set "RESULT_DIR=%WORKING_DIR%/%RESULT_SUBDIR%" mkdir "%RESULT_DIR%" cd %WORKING_DIR% setlocal ENABLEDELAYEDEXPANSION @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "Choix des phases à activer @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "Phase 1 - recherche des points clés et des correspondances (Tapioca)" set DoPhase1=false @echo "Phase 2 - Calibration intrinsèque et Orientation relative des images (Tapas)" set DoPhase3=false @echo "Phase 3 - Affinage de l'orientation relative des images (optionnel - Tapas, Campari)" set DoPhase4Mask=false set DoPhase4NewModel=false set DoPhase4Multiple=false set DoPhase4PerIm=false @echo "Phase 4 - Calcul de la carte de profondeur, puis du nuage de points (Malt)" @echo "toujours fait si on n'arrete pas le script avant lors d'une pause" @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "Phase 1 - recherche des points clés et des correspondances" @echo "---------------------------------------------------" @echo "---------------------------------------------------" if %DoPhase1%==true "%BIN_DIR%/mm3d" Tapioca MulScale "%P_ALL%" 300 800 @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "Phase 2 - Calibration intrinsèque et Orientation relative des images" @echo "---------------------------------------------------" @echo "---------------------------------------------------" if %DoPhase3%==true ( call:SetOriVar "RadialBasic" & REM SetOriVar charge les valeurs des variables !OriIn! et !OriOut! "%BIN_DIR%/mm3d" Tapas RadialBasic "%P_ALL%" Out=!OriOut! SauvAutom=NONE !SH! "%BIN_DIR%/mm3d" AperiCloud "%P_ALL%" !OriOut! Out="%RESULT_SUBDIR%/ApCl_!OriOut!.ply" !SH! if exist "%RESULT_DIR%/ApCl_!OriOut!.ply" if exist "%MESHLAB%" ("%MESHLAB%" "%RESULT_DIR%/ApCl_!OriOut!.ply") pause "Verifier que l'orientation !OriOut! est correcte, avec ApCl_!OriOut!.ply" ) @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "Phase 3 - Affinage de l'orientation relative des images (optionnel)" @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "masque 3D pour supprimer éléments mobiles (végétation, vagues, piétons et voitures) avant affinage orientation" @echo "-------------------------" if %DoPhase4Mask%==true ( call:SetOriVar "HomolFilterMasq" & REM SetOriVar charge les valeurs des variables !OriIn! et !OriOut! @echo "saisie masque 3D if not exist "%RESULT_DIR%/ApCl_!OriIn!.ply" "%BIN_DIR%/mm3d" AperiCloud "!P_All!" !OriIn! Out="%RESULT_SUBDIR%/ApCl_!OriIn!.ply" !SH! "%BIN_DIR%/mm3d" SaisieMasqQt "%RESULT_DIR%/ApCl_!OriIn!.ply" @echo "" @echo "suppression du dossier HomolMasqFiltered qui pourrait pre-exister par securite" rmdir /S /Q "%WORKING_DIR%/HomolMasqFiltered/" @echo "filtrage des points homologues sur la base du masque 3D" "%BIN_DIR%/mm3d" HomolFilterMasq "%P_ALL%" OriMasq3D=!OriIn!/ Masq3D="%RESULT_SUBDIR%/ApCl_!OriIn!.ply" set "SH=SH="MasqFiltered"" @echo "" @echo "affinage orientation après filtrage ci-dessus" "%BIN_DIR%/mm3d" Tapas AutoCal "%P_ALL%" InCal=!OriIn! InOri=!OriIn! Out=!OriOut! SauvAutom=NONE !SH! "%BIN_DIR%/mm3d" AperiCloud "%P_ALL%" !OriOut! Out="%RESULT_SUBDIR%/ApCl_!OriOut!.ply" !SH! if exist "%RESULT_DIR%/ApCl_!OriOut!.ply" if exist "%MESHLAB%" ("%MESHLAB%" "%RESULT_DIR%/ApCl_!OriOut!.ply") pause "Verifier que l'orientation !OriOut! est correcte, avec ApCl_!OriOut!.ply" ) @echo "activate HomolMasqFiltered if it was calculated in a previous execution of the script" if exist "%WORKING_DIR%/HomolMasqFiltered/" set "SH=SH="MasqFiltered"" @echo "affinage orientation en passant de RadialBasic à RadialStd, ou RadialExtended" @echo "-------------------------" if %DoPhase4NewModel%==true ( call:SetOriVar "RadialStd" & REM SetOriVar charge les valeurs des variables !OriIn! et !OriOut! "%BIN_DIR%/mm3d" Tapas RadialStd "%P_ALL%" InCal=!OriIn! InOri=!OriIn! Out=!OriOut! SauvAutom=NONE !SH! "%BIN_DIR%/mm3d" AperiCloud "%P_ALL%" !OriOut! Out="%RESULT_SUBDIR%/ApCl_!OriOut!.ply" !SH! if exist "%RESULT_DIR%/ApCl_!OriOut!.ply" if exist "%MESHLAB%" ("%MESHLAB%" "%RESULT_DIR%/ApCl_!OriOut!.ply") pause "Verifier que l'orientation !OriOut! est correcte, avec ApCl_!OriOut!.ply" ) @echo "Affinage orientation en plusieurs passes, si une photo est mal positionnée" @echo "-------------------------" if %DoPhase4Multiple%==true ( call:SetOriVar "IterIn" & REM SetOriVar charge les valeurs des variables !OriIn! et !OriOut! @echo "Create new Ori folder to avoid crushing previous Ori" mkdir "%WORKING_DIR%/Ori-!OriOut!" cd "%WORKING_DIR%/Ori-!OriIn!" copy /Y * "%WORKING_DIR%/Ori-!OriOut!" cd "%WORKING_DIR%" call:SetOriVar "IterOut" & REM SetOriVar charge les valeurs des variables !OriIn! et !OriOut! @echo !OriIn! !OriOut! "%BIN_DIR%/mm3d" Tapas AutoCal "%P_ALL%" InCal=!OriIn! InOri=!OriIn! Out=!OriOut! SauvAutom=NONE !SH! "%BIN_DIR%/mm3d" AperiCloud "%P_ALL%" !OriOut! Out="%RESULT_SUBDIR%/ApCl_!OriOut!.ply" !SH! for /L %%I in (1,1,4) do ( "%BIN_DIR%/mm3d" Tapas AutoCal "%P_ALL%" InCal=!OriIn! InOri=!OriIn! Out=!OriOut! SauvAutom=NONE !SH! "%BIN_DIR%/mm3d" AperiCloud "%P_ALL%" !OriOut! Out="%RESULT_SUBDIR%/ApCl_!OriOut!.ply" !SH! cd "%WORKING_DIR%/Ori-!OriOut!"" copy /Y * "%WORKING_DIR%/Ori-!OriIn!" cd "%WORKING_DIR%" ) if exist "%RESULT_DIR%/ApCl_!OriOut!.ply" if exist "%MESHLAB%" ("%MESHLAB%" "%RESULT_DIR%/ApCl_!OriOut!.ply") ) @echo "Calibrage image par image, par exemple en cas d'autofocus activé" @echo "-------------------------" if %DoPhase4PerIm%==true ( @echo "Campari avec SigmaTieP=2 FactElimTieP=2.5 pour obtenir residu comparable a Tapas" call:SetOriVar PerIm-Sig2 & REM SetOriVar charge les valeurs des variables !OriIn! et !OriOut! "%BIN_DIR%/mm3d" Campari "%P_ALL%" !OriIn! !OriOut! CPI1=1 FocFree=1 PPFree=1 DRMax=2 SigmaTieP=2 FactElimTieP=2.5 !SH! @echo @echo "Deuxieme appel avec valeur par defaut SigmaTieP=1 FactElimTieP=5" call:SetOriVar PerIm-Sig1 & REM SetOriVar charge les valeurs des variables !OriIn! et !OriOut! "%BIN_DIR%/mm3d" Campari "%P_ALL%" !OriIn! !OriOut! CPI2=1 FocFree=1 PPFree=1 DRMax=2 !SH! @echo @echo "Troisieme appel avec valeur en renforcant interet pour bons points homologues" call:SetOriVar PerIm-SigDemi & REM SetOriVar charge les valeurs des variables !OriIn! et !OriOut! "%BIN_DIR%/mm3d" Campari "%P_ALL%" !OriIn! !OriOut! CPI2=1 FocFree=1 PPFree=1 DRMax=2 SigmaTieP=0.5 FactElimTieP=2 !SH! "%BIN_DIR%/mm3d" AperiCloud "%P_ALL%" !OriOut! Out="%RESULT_SUBDIR%/ApCl_!OriOut!.ply" CalPerIm=1 !SH! if exist "%RESULT_DIR%/ApCl_!OriOut!.ply" if exist "%MESHLAB%" ("%MESHLAB%" "%RESULT_DIR%/ApCl_!OriOut!.ply") pause "Verifier que l'orientation !OriOut! est correcte, avec ApCl_!OriOut!.ply" ) @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "Phase 4 - Calcul de la carte de profondeur, puis du nuage de points" @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "" @echo "Options" @echo "-------------------------" set MASTER_LIST=(DSC01409.JPG DSC01416.JPG DSC01418.JPG DSC01425.JPG DSC01426.JPG DSC01429.JPG) set /A "ZOOMF=4" @echo "Get last orientation name" call:SetOriVar & REM SetOriVar charge les valeurs des variables !OriIn! et !OriOut! set OriF=!OriIn! @echo "" @echo "Nettoyage fichiers temporaires et anciens résultats" @echo "-------------------------" @echo "pour s'assurer que si des modifications sont faites aux masques, elles seront prises en compte par Malt" mkdir "%WORKING_DIR%/Tmp-MM-Dir" & cd "%WORKING_DIR%/Tmp-MM-Dir" & del "*Masq*.tif" mkdir "%WORKING_DIR%/Pyram" & cd "%WORKING_DIR%/Pyram" & del "*Masq*.tif" mkdir "%RESULT_DIR%" & cd "%RESULT_DIR%" & del "__MMLastNuage.ply" cd "%WORKING_DIR%" & REM mkdir "%WORKING_DIR%/Zooms" @echo "" @echo "Options" @echo "-------------------------" for %%I in %MASTER_LIST% do ( if not exist "%%~nI_Masq.TIF" ("%BIN_DIR%/mm3d" SaisieMasqQt %%I ) if not exist "Ori-%OriF%/ImSec-%%I.xml" ("%BIN_DIR%/mm3d" AperoChImSecMM "%P_ALL%" %OriF% PenPerIm=0.07) ) if not exist "%RESULT_SUBDIR%/__MMLastNuage_PosCam.ply" ("%BIN_DIR%/mm3d" AperiCloud "%P_ALL%" %OriF% Out="%RESULT_SUBDIR%/__MMLastNuage_PosCam.ply" WithPoints=0) @echo "" @echo "Calculs" @echo "-------------------------" for %%I in %MASTER_LIST% do ( @echo "Calcul de la carte de profondeur avec Malt" @echo "--------" "%BIN_DIR%/mm3d" Malt GeomImage "%%I" %OriF% Master=AUTO DirMEC="%MMIMG_SUBDIR%%%~nI" Purge=true UseTA=true ZoomI=64 ZoomF=%ZOOMF% AffineLast=true SzW=2 Regul=0.05 NbVI=3 @echo "" @echo "Construction nuages de points ply finaux" @echo "--------" "%BIN_DIR%/mm3d" Nuage2Ply "%MMIMG_DIR%%%~nI/MMLastNuage.xml" Attr="%%I" RatioAttrCarte=%ZOOMF% move /Y "%MMIMG_DIR%%%~nI\MMLastNuage.ply" "%RESULT_DIR%\_%%~nI_MMLastNuage.ply" @echo "" @echo "Construction nuages de points et cartes de profondeur des étapes intermédiaires" @echo "--------" cd %MMIMG_DIR%%%~nI for /f %%G IN ('dir /b "Z_Num*_DeZoom*_STD-MALT.tif"') DO ( cd %WORKING_DIR% set "_nom=%%~nG" & set "_num=!_nom:~5,2!" & set "_zoom=!_nom:~13,3!" & REM extract substrings set "_num=!_num:_=!" & set "_zoom=!_zoom:_=!" & set "_zoom=!_zoom:m=!" & set "_zoom=!_zoom:S=!" & REM delete characters _ m S @echo "Decomposition du nom de fichier !_nom! _num:!_num! _zoom:!_zoom!" @echo "" @echo "Construction nuages de points ply" if !_num! GEQ 4 ( "%BIN_DIR%/mm3d" Nuage2Ply "%MMIMG_DIR%%%~nI/NuageImProf_STD-MALT_Etape_!_num!.xml" Attr="%%I" RatioAttrCarte=!_zoom! move /Y "%MMIMG_DIR%%%~nI\NuageImProf_STD-MALT_Etape_!_num!.ply" "%RESULT_DIR%\_%%~nI_NuageImProf_Etape!_num!_Zoom!_zoom!.ply" ) @echo "" @echo "Construction cartes de profondeur avec ombrage" if !_num! GEQ 3 ( "%BIN_DIR%/mm3d" GrShade "%MMIMG_DIR%%%~nI/Z_Num!_num!_DeZoom!_zoom!_STD-MALT.tif" Out="%RESULT_DIR%/_%%~nI_GrShade_Etape!_num!_Zoom!_zoom!.tif" Mask="%MMIMG_DIR%%%~nI/Masq_STD-MALT_DeZoom!_zoom!.tif" NbDir=20 ) ) cd %WORKING_DIR% ) @echo "" @echo "Compression des cartes de profondeur avec ombrage (tif -> png)" @echo "-------------------------" cd %RESULT_DIR% FOR /f %%G IN ('dir /b "*.tif"') DO ( "%BINAUX_DIR%/convert" "%RESULT_DIR%/%%~nG.tif" -quality 95 "%RESULT_DIR%/%%~nG.png" del "%%~nG.tif" ) cd %WORKING_DIR% @echo "" @echo "Fusion des nuages de points ply des différentes images maitresses" @echo "-------------------------" "%BIN_DIR%/mm3d" MergePly "%RESULT_DIR%\.*_MMLastNuage.*.ply" Out="%RESULT_DIR%/__MMLastNuage.ply" :: Pour voir les éventuels messages d'erreur avant disparition de la fenêtre commande : pause :: ne pas mettre exit ici, il faut que dos puisse avoir accès aux fonctions ci-dessous :: see http://www.dostips.com/DtTutoFunctions.php for the definition of dos functions @echo "---------------------------------------------------" @echo "---------------------------------------------------" @echo "Definition of functions - script will automatically close after functions are read" @echo "---------------------------------------------------" @echo "---------------------------------------------------" :SetOriVar @echo off SETLOCAL set /A "OriNum=0" for /F %%G in ('dir /B "Ori-Ori0*"') do ( set /A "OriNum+=1" & set "OriName=%%G" ) set /A "OriNum+=1" if %OriNum% LEQ 9 (set "OriNum=0%OriNum%") (ENDLOCAL & REM -- RETURN VALUES set OriIn=%OriName:~4,66% set OriOut=Ori0%OriNum%%~1 ) @echo on GOTO:EOF :GetImMinMax @echo off set /A "LocalNum=0" for /F %%G in ('dir /B "*.JPG"') do ( set /A "LocalNum+=1" if !LocalNum! == %~1 (set ImMin=%%G) if !LocalNum! == %~2 (set ImMax=%%G) ) set %LocalInter%=[%ImMin%,%ImMax%] @echo on GOTO:EOF :GetImListe SETLOCAL @echo off set "LocalInter=" set /A "LocalNum=0" for /F %%G in ('dir /B "*.JPG"') do ( set /A "LocalNum+=1" if !LocalNum! GEQ %~1 ( if !LocalNum! LEQ %~2 ( set LocalInter=!LocalInter!%%G, ) ) ) set "LocalInter=%LocalInter%," set "LocalInter=%LocalInter:,,=%" set "LocalInter=^(%LocalInter:,=^|%^)" (ENDLOCAL & REM -- RETURN VALUES set %~3=%LocalInter% ) @echo on GOTO:EOF :: Pour voir les éventuels messages d'erreur avant disparition de la fenêtre commande : pause & exit