Декодирование пакетного сценария, который использует FFMPEG, EXIFTOOLS и EXIV2 для создания панорамных изображений VR180 и VR360, таких как Google Cardboard

Я изо всех сил пытаюсь понять 2 вещи:

  1. Почему этот сценарий полностью невидим для Google

  2. Как работает такой скрипт (гораздо важнее пункта 1 …)

Чтобы лучше изучить сценарий, я снабдил его миллионом строк отладки, которые печатают, что делает сценарий … но это еще не ясно:

  • ffmpeg: хорошо, я понял и могу сделать любое необходимое преобразование
  • exiftool: что он делает и как? Предполагается, что расширенные данные exif записываются в «нормальные» изображения, чтобы они выглядели как VR180, VR360 или картон, но я не могу понять, как / откуда он получает данные и когда записывается в окончательный результат. Если у меня есть только «простые» изображения, где мне взять правильные данные exif?
  • exiv2: полная темнота …

«Документация» не особо помогает: я понял, что мне нужно создать такую ​​странную структуру папок:

  • CD
  • C: D R
  • C: VR

..и вставьте в C: D и C: D R … кое-что, чего я не совсем понимаю: в качестве источника у меня есть пара круговых изображений, снятых панорамной камерой с объективом 235 ° FOV, и я хотел бы поместить их в формат картона (.vr.jpg) и просмотреть результат в этом вьювере: https://vr.caffeinum.com/create.html

левое сферическое изображение

правое сферическое изображение

Я преобразовал их в равнопрямоугольные с помощью ffmpeg:

равнопрямоугольный левый

равнопрямоугольный правый

Я использовал:

ffmpeg -i input.jpg -vf v360=fisheye:e:ih_fov=235:iv_fov=235 -y output.jpg

Мой сценарий:

@echo off
@echo ============================
echo Run "JPG2VR.bat" without parameters to place it in "%UserProfile%SendTo"
echo                                                     -
echo ---- Option 1 ----
echo Place dual fisheye files:
echo from right vr360 cam to "c:dRdf.jpg" "c:dR"
echo from left vr360 cam to "c:ddf.jpg" "c:d"
echo                                                     -
echo ---- Option 2 ----
echo Place equirectangular panorama files:
echo from right vr360 cam to "c:dRvr360.jpg" "c:dR"
echo from left vr360 cam to "c:dvr360.jpg" "c:d"
echo                                                     -
echo ---- Option 3 ----
echo Send files or dirs: "c:ddf.jpg" "c:dvr360.jpg" "c:d" "c:dR" ... to "JPG2VR"
echo or drop it to "JPG2VR.bat" then look at:
echo "c:VRdfF.vr.jpg" - front view vr180 3D panorama
echo "c:VRdfB.vr.jpg" - back view vr180 3D panorama
echo "c:VRvr360F.vr.jpg" - front view vr180 3D panorama
echo "c:VRvr360B.vr.jpg" - back view vr180 3D panorama
echo "c:VRvr360.vr.jpg" - vr360 3D panorama
echo ----------------------------------------------

SetLocal EnableExtensions EnableDelayedExpansion

:forfiles
if "%~1"=="nul" (
@echo ==== par1 = nul, hence use par2 (%~2)
 call :doit "%~2"
 goto :ERR001
)
:main

set cmd="cmd /c "%~f0" nul "@path""

:loop
 if "%~1"=="" (
  pause
  goto :ERR002
 )

 forfiles /s /p "%~1" /m *.jpg /c %cmd% 2>nul||call :doit "%~1"
 shift
goto :loop

:doit
@echo file f1="%~f1", suffisso x1="%~x1"
rem Check for full path+file:
if not exist "%~f1" goto :ERR003

rem Check for extension:
if /i not ".jpg"=="%~x1" goto :ERR004

rem percorso della prima (dp1) , piu sottodir R , piu nome della seconda (~nx1)
@echo Imposto pair a "%~dp1R   -  %~nx1"
set pair="%~dp1R%~nx1"

set suff=F
set vr=..VR
set crop=0
if exist %pair% goto :setOutputFilename
@echo ==== "pair" does NOT exist (%pair%), hence setting PAIR to "%~dp1..%~nx1"
set pair="%~dp1..%~nx1"


set suff=B
set vr=....VR
set crop=iw/2
if not exist %pair% goto :ERR005

:setOutputFilename
@echo ==== "pair" exists (%pair%), hence setting OUTPUT to "%~dp1%vr%%~n1%suff%.vr.jpg"
set out="%~dp1%vr%%~n1%suff%.vr.jpg"



if exist %out% goto :ERR006

set FOV=235
set interp=gauss
set vf=crop=iw/2:ih:%crop%,v360=fisheye:equirect:ih_fov=%FOV%:iv_fov=%FOV%:interp=%interp%,crop=iw/2

@echo ==== Extracting exif data (ImageWidth, ImageHeight, ProjectionType, InitialHorizontalFOVDegrees, YCbCrPositioning, MakerNoteUnknown):
@echo #### exiftool -s2 -ImageWidth -ImageHeight -ProjectionType -InitialHorizontalFOVDegrees -YCbCrPositioning -MakerNoteUnknown "%~f1"
for /f "tokens=1,2,3 usebackq delims=: " %%i in (`exiftool -s2 -ImageWidth -ImageHeight -ProjectionType -InitialHorizontalFOVDegrees -YCbCrPositioning -MakerNoteUnknown "%~f1"`) do set %%i=%%j

@echo Tags found:
@echo ==== ImageWidth: %ImageWidth%
@echo ==== ImageHeight: %ImageHeight%
@echo ==== ProjectionType: %ProjectionType%
@echo ==== InitialHorizontalFOVDegrees: %InitialHorizontalFOVDegrees%
@echo ==== YCbCrPositioning: %YCbCrPositioning%
@echo ==== MakerNoteUnknown: %MakerNoteUnknown%

@echo ==== checking for image mandatory requirements: width must be 2 times height


if not defined ImageWidth (
    goto :ERR007
) else (
    @echo ==== ImageWidth found: %ImageWidth%
)
if not defined ImageHeight (
    goto :ERR008
) else (
    @echo ==== ImageHeight found: %ImageHeight%
)

set /a TrueVrWidth=%ImageHeight%*2

@echo ==== Checking aspect ratio (must be 2:1)...
if not "%ImageWidth%"=="%TrueVrWidth%" (
    goto :ERR009
) else (
    @echo ==== Aspect ratio ok
)
set ImageWidth=%ImageHeight%

if not defined InitialHorizontalFOVDegrees set InitialHorizontalFOVDegrees=75

@echo ==== Projection type found?...
if defined ProjectionType (
    @echo ======== yes, it's %ProjectionType%
 set vf=[0]crop=iw/4:ih:0[r];[0]crop=iw/4:ih:iw*3/4[l];[l][r]hstack
 @echo ==== Filter set to %vf%
 if "%suff%"=="F" set vf=crop=iw/2
) else (
    @echo ##### no
)
set tags="%temp%%~n1.jpg"
set L="%temp%%~n1L.jpg"
set R="%temp%%~n1R.jpg"
call :deltemp
if defined MakerNoteUnknown set makernotes=-makernotes:all=


@echo ####  exiftool -ThumbnailImage= -ifd1:all= -PreviewImage= -FlashPix:all= -FlashpixVersion= -mpf:all= -trailer:all= %makernotes% "%~f1" -o %tags%
exiftool -ThumbnailImage= -ifd1:all= -PreviewImage= -FlashPix:all= -FlashpixVersion= -mpf:all= -trailer:all= %makernotes% "%~f1" -o %tags%
if not exist %tags% goto :ERR010

@echo ==== set xmp 1:
set xmp="%temp%%ImageWidth%x%InitialHorizontalFOVDegrees%.xmp"
if exist %xmp% (
    @echo ==== set xmp1 ok: %xmp% , goto VR180...
    goto :vr180
) else (
    @echo ==== set xmp1 FAILED, do not go VR180, continue...
)

:xmp
set /a         FullPanoWidthPixels=%ImageWidth%*2
set /a CroppedAreaImageWidthPixels=%ImageWidth%
set /a       CroppedAreaLeftPixels=(%FullPanoWidthPixels%-%CroppedAreaImageWidthPixels%)/2

set /a         FullPanoHeightPixels=%ImageHeight%
set /a CroppedAreaImageHeightPixels=%ImageHeight%
set /a         CroppedAreaTopPixels=(%FullPanoHeightPixels%-%CroppedAreaImageHeightPixels%)/2

@echo ==== Running exiftool to set XMP tags...
echo 1|exiftool -tagsfromfile - -XMP-GPano:all^
 -XMP-GPano:UsePanoramaViewer="True"^
 -XMP-GPano:CroppedAreaLeftPixels="%CroppedAreaLeftPixels%"^
 -XMP-GPano:CroppedAreaTopPixels="%CroppedAreaTopPixels%"^
 -XMP-GPano:CroppedAreaImageWidthPixels="%CroppedAreaImageWidthPixels%"^
 -XMP-GPano:CroppedAreaImageHeightPixels="%CroppedAreaImageHeightPixels%"^
 -XMP-GPano:FullPanoWidthPixels="%FullPanoWidthPixels%"^
 -XMP-GPano:FullPanoHeightPixels="%FullPanoHeightPixels%"^
 -XMP-GPano:InitialViewHeadingDegrees="180"^
 -XMP-GPano:ProjectionType="equirectangular"^
 -XMP-GPano:InitialHorizontalFOVDegrees="%InitialHorizontalFOVDegrees%"^
 %xmp%
if not exist %xmp% (
    goto :ERR011
) else (
    @echo ---- XMO correctly set to %xmp%
)

:vr180
@echo ***************************************
@echo ********* Creating VR180 image ********, i.e. two half panoramas loking in same direction TO single image 3d panorama 180° wide
@echo ==== Filter: %vf%
@echo ==== Input for Left image: %~f1%
@echo running FFMPEG with above filter : ffmpeg -v 0 -hide_banner -i "%~f1" -bsf:v mjpeg2jpeg -filter_complex %vf% -qmin 1 -q:v 1 -map_metadata -1 -y   %L%|| del %L%
ffmpeg -v 0 -hide_banner -i "%~f1" -bsf:v mjpeg2jpeg -filter_complex %vf% -qmin 1 -q:v 1 -map_metadata -1 -y   %L%|| del %L%
if not exist %L% goto :ERR012
@echo ==== Input for right image: %pair%
@echo running FFMPEG with above filter : ffmpeg -v 0 -hide_banner -i %pair% -bsf:v mjpeg2jpeg -filter_complex %vf% -qmin 1 -q:v 1 -map_metadata -1 -y "%R%"|| del "%R%"
ffmpeg -v 0 -hide_banner -i %pair% -bsf:v mjpeg2jpeg -filter_complex %vf% -qmin 1 -q:v 1 -map_metadata -1 -y "%R%"|| del "%R%"
if not exist "%R%" goto :ERR013

@echo ==== Creating folder "%~dp1%vr%" if does not exist
if not exist "%~dp1%vr%" md "%~dp1%vr%"
if defined YCbCrPositioning set YCbCrP=-YCbCrPositioning="%YCbCrPositioning%"
set tail=-XMP-exif:all= -XMP-tiff:all= -JFIF:all= -FlashpixVersion= %YCbCrP% "-XMP-GImage:ImageMimeType=image/jpeg" "-XMP-GImage:ImageData<=%R%" 

@echo #### exiftool -tagsFromFile %tags% -ExifIFD:ExifImageWidth="%ImageWidth%" -tagsFromFile %xmp% %L% -o %out% %tail%
exiftool -tagsFromFile %tags% -ExifIFD:ExifImageWidth="%ImageWidth%" -tagsFromFile %xmp% %L% -o %out% %tail%
@echo _____________
if not exist %out% goto :ERR014
call :date

:vr360
@echo ***************************************
@echo ******* Creatingt 360 image ***********
if not defined ProjectionType goto :ERR015
if "%suff%"=="B" goto :ERR016
set out="%~dp1%vr%%~n1.vr.jpg"
if exist "%out%" goto :ERR006

:tag
@echo ==== deleting old temporary files: %R%...
del "%R%"

@echo ==== Calling exiftool for pair %pair%...
@echo #### exiftool -all= -o "%R%" %pair%
exiftool -all= -o "%R%" %pair%

if not exist "%R%" goto :ERR013

@echo ==== Calling exiftool for tail %tail%...
@echo #### exiftool %tags% -o %out% %tail%
exiftool %tags% -o %out% %tail%
if not exist %out% goto :ERR017
call :date


:deltemp
@echo ==== deleting temporary files: %tags% %L% "%R%"
del %tags% %L% "%R%"
rem ==== return back to caller
goto :EOF

:date
rem Any of -api Compact= or use -z or do not use -z breaks compatibility with https://arvr.google.com/vr180/apps/
exiv2 -M"set Xmp.GPano.InitialHorizontalFOVDegrees %InitialHorizontalFOVDegrees%" %out%
exiftool "-FileCreateDate<CreateDate" "-FileModifyDate<ModifyDate" %out%
:exiftool -X %out% -w! .xml


:ERR001
@echo     -------------  EXIT WITH ERROR
goto :EOF

:ERR002
@echo     -------------  Fine parametri"
goto :EOF

:ERR003
@echo     -------------  003 File '%~f1%' not found
goto :EOF

:ERR004
@echo     -------------  Not jpg
goto :EOF


:ERR005
@echo     -------------  005 File '%pair%' not found
goto :EOF

:ERR006
@echo     -------------  Overwrite prevented
goto :EOF

:ERR007
@echo     -------------  Missing width
goto :EOF


:ERR008
@echo     -------------  Missing height
goto :EOF


:ERR009
@echo     -------------  Image is not rectangular
goto :EOF

:ERR010
@echo     -------------  Error creating output file "%tags%" with exif
goto :EOF


:ERR011
@echo     -------------  Failed to set XMP tags
goto :EOF


:ERR012
@echo     -------------  Error on left image
goto :EOF


:ERR013
@echo     -------------  Error on right image
goto :EOF


:ERR014
@echo     -------------  Exiftools for tail failed
goto :EOF


:ERR015
@echo     -------------  Error, VR360 images require ProjectionType tag in source images
goto :EOF


:ERR016
@echo     -------------  Error, suffix = B (?)
goto :EOF


:ERR016
@echo     -------------   Failed on tail (?)
goto :EOF

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *