Deinterlacing videa z Pentaxu

23.09.2019 | 08:30 | Mirecove dristy | Miroslav Bendík

Ostránenie prekladania (deinterlacing) je celkom bežná úprava videa. Nakoniec mi takáto blbosť zabrala celý deň experimentovania. Prečo som sa trápil s deinterlacingom tak dlho sa dozviete v nasledujúcom blogu.

Zdrojové video

Nedávno som písal malú knižnicu pre ovládanie displaya z MCU STM32F103C8T6 (cena okolo 1.5 €). Display dokážem aktualizovať rýchlosťou cca 60 fps. Moja kamera však vie nahrávať len 1080p/30fps, alebo 1080i/60fps. Takže som sa rozhodol nahrávať v prekladanom režime a dodatočne urobiť deinterlacing v softvéri.

Vstupné video - statická časť

Obrázok 1: Vstupné video - statická časť

Vstupné video - pohyblivá časť

Obrázok 2: Vstupné video - pohyblivá časť

Prekladanie je špeciálny režim videa kedy sa obraz skladá z polsnímkov. Namiesto plných 60 snímkov za sekundu sa posiela najskôr snímok s párnymi riadkami a potom snímok z nepárnymi riadkami. Spojenie do celistvého videa nie je úplne triviálne, pretože pre každý polsnímok sa musí dorátať chýbajúca polovica obrazu.

Skúšal som rôzne bežné metódy deinterlacingu a so žianou som pre moje video nebol spokojný. V nasledujúcej časti je ich prehľad aj s nedostatkami, ktoré som zaznamenal v testovacom videu.

Metódy odstránenia prekladania

Text pri metódach platí len pre testovacie video. V závere blogu sa dostanem k tomu, prečo je moje vstupné video chybné a preto preň nefungujú bežné metódy deinterlacingu.

Kernel deinterlacing

Pri použití tohto filtra som prišiel o polovicu snímkov. Vertikálne rozlíšenie je rovnaké ako vstupné video (tj. polovičné).

Kerneldeint video - statická časť

Obrázok 3: Kerneldeint video - statická časť

Kerneldeint video - pohyblivá časť

Obrázok 4: Kerneldeint video - pohyblivá časť

Yadif deinterlacing

Výsledky sú takmer totožné s kernel deinterlacingom. V rýchlo pohybujúcich sa častiach môžu byť malé artefakty. Framerate je zase polovičný.

Yadif video - statická časť

Obrázok 5: Yadif video - statická časť

Yadif video - pohyblivá časť

Obrázok 6: Yadif video - pohyblivá časť

Mcdeint deinterlacing

Veľmi pomalý deinterlacing, ktorý dopočítava chýbajúce riadky z pohybových vektorov predchádzajúcich a nasledujúcich snímkov. Vďaka tomu má výstup 60 snímkov za sekundu. Vertikálne rozlíšenie také ako vstupné (tj. polovičné).

Mcdeint video - statická časť

Obrázok 7: Mcdeint video - statická časť

Mcdeint video - pohyblivá časť

Obrázok 8: Mcdeint video - pohyblivá časť

Nnedi3 deinterlacing

Metóda nnedi3 využíva neurónové siete. K svojmu fungovaniu využíva len polsnímok (v podstate pracuje so 540p a škáluje ho na 1080p). Výsledky sú super až na to, že moje video poskakuje o pixel.

Nnedi3 video - statická časť

Obrázok 9: Nnedi3 video - statická časť

Nnedi3 video - pohyblivá časť

Obrázok 10: Nnedi3 video - pohyblivá časť

QTGMC deinterlacing

Táto metóda využíva niekoľko šikovných trikov + ďalšie metódy deinterlacingu, medzi inými aj nnedi3. K použitiu na linuxe si musíme napísať malý skript pre VapourSynth.

Výsledok má síce skvelú ostrosť, detaily, 60fps, ale časť obrazu poskakuje o pixel.

# deinterlace.vpy
import os

import havsfunc as haf
import vapoursynth as vs

core = vs.get_core()
clip = core.ffms2.Source(source=os.environ['VIDEO_SOURCE'])
clip = haf.QTGMC(Input=clip, Preset="Placebo", TFF=True)
clip.set_output()
# deinterlace.sh
export VIDEO_SOURCE=$1
vspipe ./deinterlace.vpy - --y4m|ffmpeg -i - -c:v libx264 -x264opts "keyint=60" -preset placebo -crf 1 -r 60000/1001 $1.deint.mkv
QTGMC video - statická časť

Obrázok 11: QTGMC video - statická časť

QTGMC video - pohyblivá časť

Obrázok 12: QTGMC video - pohyblivá časť

Prečo to poskakovanie?

Detail vstupného videa

Obrázok 13: Detail vstupného videa

Je samozrejme vysoko nepravdepodobné, že by každý deinterlacer bol zlý. V skutočnosti je zle nahrané vstupné video.

Štandardne by prekladané video malo mať v každom druhom snímku párne a nepárne riadky. V mojom videu sú však riadky len párne. Preto by sa asi ani nemalo označovať ako 1080i, ale 540p.

Aby som nebol úplne zlý na moju kameru tak prvý riadok je prekladaný správne ;) Bloky s rovnakou farbou sú posunuté oproti jasu o jeden riadok, čo trochu komplikuje orezávanie videa a nakoniec aj jeho deinterlacing.

Môj finálny deinterlace skript používa ako základ QTGMC. Vďaka tomu dostanem na výstupe pekných 1080p (síce dopočítaných, ale rozdiel oproti originálu je minimálny). Skript duplikuje každý snímok 2x a pre každý druhý snímok urobí orez posunutý o jeden pixel voči susedom. Takto pripravené video vykazuje po aplikácii deinterlacera minimálne trasenie (spôsobené posunom farebného signálu o jeden pixel, ale s tým nedokážem už nič ďalšie spraviť), má slušné vertikálne rozlíšenie a 60 snímkov za sekundu.

# deinterlace.vpy
import os

import vapoursynth as vs
import havsfunc as haf


def combine(n, f):
    if n % 2 == 0:
        frame = f[0].copy()
    else:
        frame = f[1].copy()
    return frame


core = vs.get_core()
clip = core.ffms2.Source(source=os.environ['VIDEO_SOURCE'])
clip = core.std.SelectEvery(clip=clip, cycle=2, offsets=1) # kazdy frame je duplicitny, redukujem
clip = core.resize.Bicubic(clip, format=vs.YUV444P10)      # kvoli orezaniu na pixel musi byt YUV444
clip = core.std.SelectEvery(clip=clip, cycle=2, offsets=[0, 0, 1, 1]) # duplikacia snimkov
clip_odd = core.std.CropAbs(clip, clip.width, clip.height - 2, 0, 1) # orezanie s posunom o pixel
clip_even = core.std.CropAbs(clip, clip.width, clip.height - 2, 0, 2) # orezanie s posunom o 2 pixely
# zlozenie vysledneho videa skladanim snimkov striedavo z clip_odd / clip_even
clip = core.std.ModifyFrame(clip=clip_odd, clips=[clip_even, clip_odd], selector=combine)
clip = core.std.AssumeFPS(clip, fpsnum=60000, fpsden=1001)
clip = haf.QTGMC(Input=clip, Preset="Slow", TFF=True)
clip = core.std.SelectEvery(clip=clip, cycle=2, offsets=0)
clip = core.std.AddBorders(clip=clip, bottom=2)
clip.set_output()
QTGMC modifikované video - statická časť

Obrázok 14: QTGMC video - statická časť

QTGMC modifikované video - pohyblivá časť

Obrázok 15: QTGMC video - pohyblivá časť

Video, ktoré som upravoval som uploadol skôr než, som dopísal deinterlacer. Ak by to napriek tomu niekto chcel vidieť moje video tak tu je link na môj youtube.

STM32 mandelbrot

Pokusné súbory sú priložené k blogu.

Prílohy

    • RE: Deinterlacing videa z Pentaxu 23.09.2019 | 08:57
      Avatar WlaSaTy   Návštevník

      Pekné, ale nebolo by aj niečo k tomu displeju čo zvláda zobrazovať 1080@60?

      • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 11:58
        Avatar Miroslav Bendík Gentoo  Administrátor

        Pravdu povediac veľké zariadenia na veľké displaye ma akosi prestali baviť. Teraz sa akurát chcem pustiť do stavby jedného malého zariadenia so senzormi a bezdrôtovým modulom, ktoré by vydržalo pár rokov na CR2032. Ehm ten display som kúpil možno len ako informačný display pre vnútornú jednotku a možno ani to nie. V každom prípade na aliexprese bol za dolár aj niečo tak som ho prihodil do košíka aby som sa mal na čom učiť SPI :D

        • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 13:09
          Avatar WlaSaTy   Návštevník

          Že je to malé a asi aj lacné, to mi došlo z fotky. Ale zaujalo ma že to zvláda HD. Nejaké jednoznačné kľúčové slovo by teda nebolo?

          Ono, možno by to išlo aj napriamo nacvaknúť na rPI, pridať modem a klábosničku a človek by mal zas niečo výkonnejčie ako bol OpenMoko GTA04.

          • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 14:16
            Avatar Miroslav Bendík Gentoo  Administrátor

            Display s rozlíšením 240x240 dokážem aktualizovať rýchlosťou 60fps, nie full HD. Mne to pripadá vcelku zrozumiteľne napísané akurát nepovažujem za dôležité uvádzať rozlíšenie LCD. Po celý čas v blogu píšem o kamere.

            • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 15:11
              Avatar WlaSaTy   Návštevník

              Zrozumiteľne to napísané aj bolo, ale mňa tam zaujala okrajová záležitosť. Nuž, otázka bola zodpovedaná :-)

    • RE: Deinterlacing videa z Pentaxu 23.09.2019 | 16:03
      Avatar bedňa LegacyIce-antiX  Administrátor

      A čo tak napísať do Pentaxu že prekladané video nie je prekladané, to je predsa úplne celé zle.

      Tochu mi to pripomenulo Doom Guya, ten spodný je vytvorený z toho vrchného pomocou neurónových sietí. Teraz je otázka, koľko pixelov je potrené aby sme vytvorili nejakú "realitu", čochvíľa sa to bude blížiť nule.

      Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
      • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 11:58
        Avatar Miroslav Bendík Gentoo  Administrátor

        Myslím, že to by nepomohlo. Tuším im enkódery dodáva fujitsu.

    • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 08:11
      Avatar Pavel Q4OS KDE  Administrátor

      Len pre zaujímavosť niekde som zachytil, že Pentax ignoruje momentálne bezzrkadlovky z toho dôvodu, že si myslí že je to len chvíľkový boom. A napríklad Sigma oznámila, že už nebude vytvárať objektívy pre Pentax, takže táto značka to asi nemá jednoduché,,, Ale to len bokom,,,

      • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 10:13
        Avatar WlaSaTy   Návštevník

        Ten chvíľkový boom trvá cez desať rokov. I keď je pravda že ja som to vtedy kupoval ako EVF.

        • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 15:47
          Avatar Pavel Q4OS KDE  Administrátor

          Noo veď práve,,,

          • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 16:20
            Avatar WlaSaTy   Návštevník

            Ani nie, napríklad Pentax K-01 je bezzrkadlovka z roku 2012. Staršie sa mi nechcelo hľadať, zobral som prvý výsledok z vyhľadávača.

            Nemyslel si náhodou foťáky so zabudovaným objektívom ktorý sa nedá vymeniť ako bolo zvykom pri starých zrkadlovkách?

            • RE: Deinterlacing videa z Pentaxu 25.09.2019 | 00:24
              Avatar Pavel Q4OS KDE  Administrátor

              Nie nemyslel, vo foťákoch sa trochu vyznám :-)

              • RE: Deinterlacing videa z Pentaxu 25.09.2019 | 08:32
                Avatar WlaSaTy   Návštevník

                Z toho linku:

                Pentax K-01 is a mirrorless interchangeable-lens camera announced in February 2012.

                Takže mirrorless camera neznamená bezzrkadlovka? Hmmm, vidím že sa vyznáš. Od zrkadla sa upúšťa už dlho, a optický hľadáčik sa tak nahrádza elektronickým. Zaujímalo by ma teda čo podľa teba znamená bezzrkadlovka.

                • RE: Deinterlacing videa z Pentaxu 25.09.2019 | 09:29
                  Avatar Pavel Q4OS KDE  Administrátor

                  Počkaj počkaj, ty o čom teraz točíš? Ak si sa zle vyspal a potom si sa zabával s googlením ráno tak to povedz na rovinu. Kde som tvrdil že miroless a bezzrkadlovka nie je to isté? Napísam som len čo tvrdí Pentax, a keď už sme pri tom nie je to len o hľadáčiku, už trošku uber s tou tvojou všade som bol všetko viem,,,

                  • RE: Deinterlacing videa z Pentaxu 25.09.2019 | 14:23
                    Avatar WlaSaTy   Návštevník

                    Stále točím o tom, ako si pre zaujímavosť niekde som zachytil, že Pentax ignoruje momentálne bezzrkadlovky ktoré už robí skoro 10 rokov. Pár rokov s tým meškal, to je pravda. Ale to bolo pradávno.

                    • RE: Deinterlacing videa z Pentaxu 25.09.2019 | 14:36
                      Avatar Pavel Q4OS KDE  Administrátor

                      Pentax ignoruje momentálne bezzrkadlovky, viac nemám čo dodať,,,

                      • RE: Deinterlacing videa z Pentaxu 25.09.2019 | 15:32
                        Avatar WlaSaTy   Návštevník

                        Napríklad sa stále vyrába bezzrkadlovka Pentax Q-S1.

                        Je zbytočné sa hádať na tému "niekde som zachytil". Pozdravuj toho "niekde". Ja tento typ okrajových informácií (niekde, niekto) radšej preventívne vypúšťam z mysle.

            • RE: Deinterlacing videa z Pentaxu 25.09.2019 | 00:27
              Avatar Pavel Q4OS KDE  Administrátor

              Link na pár mojich cvakov,,,

    • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 15:33
      Avatar easySolution   Návštevník
      Spojenie do celistvého videa nie je úplne triviálne, pretože pre každý polsnímok sa musí dorátať chýbajúca polovica obrazu.

      Stare televizory tiez zobrazovali parne/neparne snimky, 50 polnimkov za sekundu. Vinou nedokonalosti oka clovek videl cely obraz 25 snimkou za sekundu.

      Preco si jednoducho polnimky neukladal do buffra a potom celu snimku zobrazil ako ich kombinaciu?

      • RE: Deinterlacing videa z Pentaxu 24.09.2019 | 15:42
        Avatar Miroslav Bendík Gentoo  Administrátor

        Pretože polsnímky sú voči sebe časovo posunuté o 1/60s.