Life in frames / Produkcja filmowa, postprodukcja i animacja

Zaawansowana stabilizacja obrazu z DSLR przy pomocy Adobe After Effects CS4

Naucz się stabilizować ujęcia z lustrzanki i skorygować rolling shutter przy pomocy zaawansowanych technik w Adobe After Effects CS4.

AFSDSLR_en

Wstęp

Czasami zdarza się tak, że potrzebna jest stabilizacja ujęć kręconych z ręki lub przy użyciu innych narzędzi, które jednak mają wady techniczne – drgania lub wstrząsy.

W przypadku większości kamer wady techniczne takiego obrazu polegać będą na przesunięciu obrazu w osi X i Y i ewentualnie rozmyciu (motion blur). W przypadku lustrzanek lub innych kamer z przetwornikiem CMOS dochodzi do tego jeszcze problem tzw. rolling shutter, czyli pochylenie obrazu (skew), które jest wynikiem specyficznej konstrukcji DSLRów i jest ściśle skorelowane z ruchem kamery. Z tego powodu standardowe narzędzia stabilizujące obraz nie poradzą sobie z takim materiałem. Stabilizacja względem jednego punktu pozostawi wyraźne drgania spowodowane zmiennym pochyleniem obrazu.

Pluginy do stabilizacji video z matryc CMOS

Istnieje dość dobra kombinacja zewnętrznych narzędzi, która pozwala poradzić sobie z problemem stabilizacji i rolling shutter. Optymalnym rozwiązaniem wydaje się połączenie pluginów Core Melt’s Lock and Load oraz The Foundry Rolling Shutter Plugin. Niestety łączny ich koszt jest dość spoty (Rolling Shutter kosztuje 500 USD, Lock And Load – 150 USD). Porównanie i efekty działania tych narzędzi znajdziecie tutaj:

The Jedi Way

Podczas pracy nad ostatnim projektem musiałem użyć kilku ujęć, które były robione ze statywu umieszczonego na podnośniku budowlanym przy użyciu obiektywu bez stabilizacji. Materiał charakteryzował się mocnymi drganiami, które wydawały się trudne do skorygowania. Nie miałem ani powyższych pluginów, ani budżetu na ich zakup. Musiałem więc rozwiązać problem inaczej. Po przemyśleniu tematu i odświeżeniu trygonometrii znalazłem rozwiązanie, które daje dobre rezultaty i wymaga wyłącznie użycia Adobe After Effects.

Odrobina teorii

Jak skorygować efekt rolling shutter?

  1. Wykonujemy Motion Tracking na 2 punktach, tak, jak robilibyśmy to dla stabilizacji obrazu w osi X i Y z uwzględnieniem rotacji. Dobrze, by punkty, które śledzimy, były położone po przeciwległych stronach obrazu, tzn. jeden obok górnej, drugi obok dolnej krawędzi obrazu.
  2. Znajdujemy prostą łączącą 2 punkty na pierwszej klatce oraz wyliczamy kąt jej odchylenia względem pionu. Do wyliczenia kąta nachylenia posłuży nam funkcja arcus tangens oraz współrzędne obu trackerów. Wyliczona wartość posłuży nam do znormalizowania wyniku.
  3. Kąt odchylenia tej prostej od pionu wyliczamy dla całego video, które korygujemy.
  4. Na obraz nakładamy stabilizację w osi X i Y względem wybranego punktu obrazu.
  5. Na obraz dodatkowo nakładamy transformację pochylenia (skew), która jako zmienny parametr ma przypisany wyliczony kąt nachylenia prostej znormalizowany względem pierwszej klatki lub całego przebiegu.

Kąt alfa nachylenia prostej przechodzącej przez 2 punkty (x1,y1; x2,y2) względem układu współrzędnych wygląda tak:

alfa = arctan ((|x1 - x2|) /  (|y1 - y2|))

Wyrażenie (poprawione) w języku skryptowym, jakie musimy przypisać dla współczynnika pochylenia w After Effects wygląda następująco:

skew = (radiansToDegrees(Math.atan(
        Math.abs(
                (motionTracker("Tracker 1")("Track Point 1").featureCenter[0]
                - motionTracker("Tracker 1")("Track Point 2").featureCenter[0])
        )
        / Math.abs(
                (motionTracker("Tracker 1")("Track Point 1").featureCenter[1]
                - motionTracker("Tracker 1")("Track Point 2").featureCenter[1])
        )
))-a)*(-1)

Gdzie:

  • skew jest zmienną wartością kątową, o jaką musimy pochylić obraz, żeby skorygować rolling shutter
  • a jest kątem nachylenia prostej przechodzącej przez oba punkty trackera do osi Y układu współrzędnych na pierwszej klace filmu (lub uśredniona wartość nachylenia dla całego przebiegu)
  • motionTracker(“Tracker 1″) jest referencją do naszego trackera
  • (“Track Point 1″).featureCenter[0] to współrzędna X pierwszego punktu trackera
  • (“Track Point 1″).featureCenter[1] to współrzędna Y pierwszego punktu trackera
  • (“Track Point 2″).featureCenter[0] to współrzędna X drugiego punktu trackera
  • (“Track Point 2″).featureCenter[1] to współrzędna Y drugiego punktu trackera

Całość musimy przemnożyć przez -1, gdyż korygujemy obliczone nachylenie, zatem skew musi przyjmować wielkość równą co do wartości, ale przeciwną co do znaku.
Jako że Math.atan zwraca na kąt w radianach, musimy wykonać konwersję przy pomocy funkcji radiansToDegrees.

Praktyka

  1. Tworzymy kompozycję nieco większą niż rozmiar klipu, który stabilizujemy
  2. Przeciągamy fragment filmu, który będziemy stabilizować na timeline i ustawiamy go w centrum sceny
  3. Uruchamiamy motion tracking dla 1 punktu w centrum kadru
  4. Uruchamiamy analizę i stabilizujemy w osi X i Y obraz względem trackera (zakładam, że nie jest potrzebna stabilizacja obrotu)
  5. Tworzymy nową kompozycję o tych samych rozmiarach i przenosimy na nią kompozycję z ustabilizowanym filmem
  6. Tworzymy tracker z 2 punktami śledzącymi (w tym celu trzeba zaznaczyć opcję “position” i “rotation” w zakładce trackera)
  7. Ustawiamy dwa punkty śledzące trackera na nieruchomych detalach na górze i na dole obrazu
  8. Analizujemy obraz, ale nie potwierdzamy stabilizacji obrazu po zakończeniu analizy
  9. Na klip nakładamy efekt Transform
  10. W timelinie znajdujemy NaszKlip > Effects > Transform > Skew i klikamy z Alt-em opcję animacji parametru. Spowoduje to otwarcie pola na skrypt.
  11. Wklejamy skrypt (poprawiona wersja):
    (radiansToDegrees(Math.atan(
            Math.abs(
                    (motionTracker("Tracker 1")("Track Point 1").featureCenter[0]
                    - motionTracker("Tracker 1")("Track Point 2").featureCenter[0])
            )
            / Math.abs(
                    (motionTracker("Tracker 1")("Track Point 1").featureCenter[1]
                     - motionTracker("Tracker 1")("Track Point 2").featureCenter[1])
            )
    ))-0)*(-1)
  12. Jeśli Twój tracker nazywa się “Tracker 1” i ma dwa punkty “Track Point 1” i “Track Point2” nie musisz nic robić. Jeśli masz inne nazwy, musisz zmodyfikować odpowiednio zmienne w skrypcie podając referencje do Twojego trackera.
  13. Zczytujemy zapaloną na czerwono wartość skew i dopisujemy ją zamiast wartości 0 na końcu skryptu
  14. Ewentualnie cropujemy obraz i renderujemy całość.

Rezultaty

Tak wyglądają rezultaty. Klip porównuje surowy materiał, materiał ustabilizowany oraz materiał ustabilizowany i skorygowany opisanym algorytmem.


6 Responses to “Zaawansowana stabilizacja obrazu z DSLR przy pomocy Adobe After Effects CS4 ”

  1. Mike says:

    On the last shoot U should just use a good tripod;)

  2. Patryk Kizny says:

    Michał, Thank you for your advice. However I think you missed one detail. Let me explain by posting a small BTS image ;)
    Lever

  3. Patricio Londaits says:

    I get an error when I paste the script it says “Function Math.athan() is undefined”

  4. Joshua says:

    Didn’t work for me as well as it did for you… Maybe I got the formula wrong, not sure. I had better results with deshaker. Thanks for posting the tutorial nonetheless.

  5. Joshua says:

    The code that is posted definitely does not work. It yields an error. I had to check the image to extract the proper formula. I think my problem was the value in red to be copied and inserted into the formula. My number was 0.1 and it didn’t seem to do very much….

  6. Patryk Kizny says:

    OK, I have checked the code and, indeed, there was a syntax error. I fixed it and you’ll find the right code in the post body. Apologies for my mistake.