2. diel - Práca s videom v Pythone a kreslenie a písanie do obrázkov
V minulej lekcii, Úvod do analýzy obrazu a videa v Pythone , sme si predstavili knižnice, s ktorými budeme pracovať, a ukázali si ako fungujú. V dnešnom Python tutoriále si ukážeme ako načítať, zobraziť a uložiť video vo formáte MP4. Naučíme sa tiež kresliť tvary na obrázky a písať do nich text.
Najskôr si musíme zohnať nejaké ukážkové video, s ktorým budeme pracovať. Pre potreby kurzu som použil video nižšie. Ak chcete, môžete použiť samozrejme aj nejaké vlastné.
Súbor s videom si uložte akovideo.mp4 do zložky s dnešným
projektom.
Načítanie videa
V prvej ukážke si video načítame, snímku po snímke zmenšíme na veľkosť 640x480px a zobrazíme. Prehrávanie zmenšeného videa sa ukončí klávesom X:
import cv2 vc = cv2.VideoCapture("video.mp4") while True: v_poradku, snimek = vc.read() snimek = cv2.resize(snimek, (640, 480)) cv2.imshow("video", snimek) if cv2.waitKey(1) & 0xFF == ord("x"): break vc.release() cv2.destroyAllWindows()
Nejříve si video načítame pomocou cv2.VideoCapture(zdroj) a
potom vytvoríme cyklus. V ňom získame snímka funkcií
vc.read(), ktorá vracia okrem snímke booleanovskou hodnotu, či
bola snímka prečítaný v poriadku. Video má rozlíšenie
1280x720, to je moc a preto ho zmenšíme na rozlíšenie
640x480 funkcií
cv2.resize(snimek, (velikost -> tuple). Nakoniec pridáme
podmienku či používateľ stlačil kláves X. Ak áno, vyskočíme
z cyklu a odpojíme zdroj videa pomocou vc.release() a všetky
okná zavrieme funkcií cv2.destroyAllWindows().
Keby sme chceli snímať obraz z webkamery, použili by sme namiesto názvu
súboru parameter 0, záleží koľko by sme mali zariadenia, napr.
Ako cv2.VideoCapture(0):
import cv2 vc = cv2.VideoCapture("video.mp4") while True: v_poradku, snimek = vc.read() if not v_poradku: vc.set(cv2.CAP_PROP_POS_FRAMES, 0) continue snimek = cv2.resize(snimek, (640, 480)) cv2.imshow("video", snimek) if cv2.waitKey(1) & 0xFF == ord("x"): break vc.release() cv2.destroyAllWindows()
Po skončení prehrávania naše aplikácie zatiaľ spadne s chybou.
Prehrávanie videa v slučke
Ak video skončí, doterajší skript vyvolá error. Aby sme tomuto predišli
a video sa mohlo prehrávať stále dookola, využijeme hodnotu
v_poradku, ktorú vracia funkcia vc.read(). Ak sa
snímka neprečíta v poriadku, nastavíme ukazovateľ na snímku 0
pomocou vc.set(cv2.CAP_PROP_POS_FRAMES, 0) a video sa prehrá
znova.
Zobrazenie viacerých snímok naraz a čiernobiely efekt
Teraz si zobrazíme 2 snímky naraz, ten druhý však bude šedý:
import cv2 vc = cv2.VideoCapture("video.mp4") while True: v_poradku, snimek = vc.read() if not v_poradku: vc.set(cv2.CAP_PROP_POS_FRAMES, 0) continue snimek = cv2.resize(snimek, (640, 480)) snimek_gray = cv2.cvtColor(snimek, cv2.COLOR_BGR2GRAY) cv2.imshow("video", snimek) cv2.imshow("video_gray", snimek_gray) if cv2.waitKey(1) & 0xFF == ord("x"): break vc.release() cv2.destroyAllWindows()
výsledok:

Uloženie videa
Dôležitou zručností je bezpochyby vedieť video uložiť. Nasleduje ukážka kódu, ktorá presne toto robí, s vysvetlením nižšie:
vc = cv2.VideoCapture("video.mp4") codec = cv2.VideoWriter_fourcc(*"MP4V") vw = cv2.VideoWriter("vytvorene_video.mp4", codec, 24, (640, 480)) while True: v_poradku, snimek = vc.read() if not v_poradku: break snimek = cv2.resize(snimek, (640, 480)) vw.write(snimek) cv2.imshow("video", snimek) if cv2.waitKey(1) & 0xFF == ord("x"): break vc.release() vw.release() cv2.destroyAllWindows()
Video si načítame a potom definujeme codec
cv2.VideoWriter_fourcc(znak1, znak2, znak3, znak4). Keďže funkcia
požaduje odovzdať viac znakov, používame takzvanú starred
expression, ktorá nám reťazec rozseká na jednotlivé znaky.
Nakoniec vytvoríme VideoWriter, ktorý bude zapisovať do súboru
pomocou cv2.VideoWriter(soubor, codec, fps, velikost). Jednotlivé
snímky uložíme funkcií vw.write(snimek) a po ukončení zápisu
VideoWriter odpojíme funkcií vw.release().
Kreslenie do videa
Na snímky videa môžeme samozrejme kresliť. A to od čiary až po mnohouholník či vkladanie textu na obrázok či video.
V ukážke budem používať opäť obrázok nižšie, ak však chcete používať vlastné, nič vám v tom nebráni. Tiež môžete upravovať priamo jednotlivé snímky videa.

Najprv si ako vždy načítame náš obrázok a vykreslíme ho na obrazovku:
import cv2 import numpy as np img = cv2.imread("letadlo.jpg") cv2.imshow("obrazek", img)
Ďalej do neho vykreslíme čiaru a počkáme na ľubovoľnú klávesu:
cv2.line(img, (0, 0), (300, 550), (255, 255, 255), 10) cv2.imshow("obrazek", img) cv2.waitKey() cv2.destroyAllWindows()
Kreslíme jednoduchú bielu čiaru pomocou funkcie
cv2.line(obrázek, počáteční pozice, konečná pozice, barva jako BGR, tloušťka).
výsledok:

Výborne, ako ďalší si ukážeme štvorec:
cv2.rectangle(img, (50, 50), (300, 300), (150, 200, 0), -1)
Pre vykreslenie štvorca používame funkciu
cv2.rectangle(obrazek, pozice vlevo nahoře, pozice vpravo dole, barva, tloušťka).
Všimnite si, že sme použili hrúbku -1, to znamená, že sa
štvorec vyplní:

Ako ďalšie tvar si vykreslíme kruh:
cv2.circle(img, (250, 250), 90, (0,0,255), 8)
Pre vykreslenie kruhu použijeme funkciu
cv2.circle(obrazek, střed, poloměr, barva, tloušťka).
Skúsme aj vykrojenou elipsu:
cv2.ellipse(img, (1050, 400), (145, 50), 195, 0, 270, (0, 0, 255), -1) cv2.circle(img,(985, 350), 5, (0, 255, 0), -1)
Pre vykreslenie elipsy používame funkciu
cv2.circle(obrazek, střed, velikost os, rotace, počáteční úhel, konečný úhel, barva, tloušťka).
A výsledok:

Posledným tvarom je mnohouholník čiže polygón:
pts = np.array([ [0, 0], [200, 500], [300, 300], [10, 50] ]) `cv2.polylines(img, [pts], True, (0, 255, 255), 3)`
Najskôr si vytvárame numpy polia, kde sú uložené pozície jednotlivých
bodov mnohouholníka pomocou
np.array(list, datový typ - zde není nutné). Potom z týchto
bodov vytvoríme samotný mnohouholník funkcií
cv2.polylines(obrázek, [body], booleanovska hodnota - zda se má spojit první a poslední bod , barva, tloušťka).
Výsledný obrázok:

Tvary máme za sebou a teraz sa pozrieme na vkladanie textu:
cv2.putText(img, "Python", (50, 250), cv2.FONT_ITALIC, 5, (224, 157, 33), 3, cv2.LINE_4) cv2.putText(img, "na", (50, 400), cv2.FONT_HERSHEY_COMPLEX_SMALL, 5, (50, 201, 209), 3, cv2.LINE_8) cv2.putText(img, "ITnetworku!", (50, 550), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 5, (224, 157, 33), 3, cv2.LINE_AA)
Pre vloženie textu do obrázku použijeme funkciu
cv2.putText(obrázek, text, pozice, font, velikost fontu, barva), tloušťka, typ linie/čáry).
Opäť si ukážme výsledný obrázok:

Bonus
Ak vás kreslenie naozaj zaujalo, skúste si nakresliť domček jedným
ťahom funkcií cv2.polylines(). Hotové riešenie nájdete k
stiahnutiu v prílohe článku spolu s ďalšími zdrojovými kódmi.

V budúcej lekcii, Práca s pixelmi a operácie s obrázkami v Pythone , sa pozrieme na prácu s pixelmi a aritmetické operácie s obrázkami. Tiež si ukážeme ako vložiť logo do obrázka.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 75x (24.91 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Python
