Deinterlacing videa z Pentaxu
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.
Obrázok 1: Vstupné video - statická č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é).
Obrázok 3: Kerneldeint video - statická č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ý.
Obrázok 5: Yadif video - statická č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é).
Obrázok 7: Mcdeint video - statická č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.
Obrázok 9: Nnedi3 video - statická č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
Obrázok 11: QTGMC video - statická časť
Obrázok 12: QTGMC video - pohyblivá časť
Prečo to poskakovanie?
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()
Obrázok 14: QTGMC video - statická č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.
Pokusné súbory sú priložené k blogu.
Prílohy
- priklad.tar.bz2 (747.2 kB)
Pre pridávanie komentárov sa musíte prihlásiť.
Pekné, ale nebolo by aj niečo k tomu displeju čo zvláda zobrazovať 1080@60?
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
Ž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.
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.
Zrozumiteľne to napísané aj bolo, ale mňa tam zaujala okrajová záležitosť. Nuž, otázka bola zodpovedaná :-)
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.
Myslím, že to by nepomohlo. Tuším im enkódery dodáva fujitsu.
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,,,
Ten chvíľkový boom trvá cez desať rokov. I keď je pravda že ja som to vtedy kupoval ako EVF.
Noo veď práve,,,
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?
Nie nemyslel, vo foťákoch sa trochu vyznám :-)
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.
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,,,
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.
Pentax ignoruje momentálne bezzrkadlovky, viac nemám čo dodať,,,
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.
Link na pár mojich cvakov,,,
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?
Pretože polsnímky sú voči sebe časovo posunuté o 1/60s.