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é 72x (24.91 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Python