IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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 ako video.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:

Zobrazenie viac snímok videa naraz a čiernobiely efekt v Pythone - Analýza obrazu a videa v Pythone

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.

obrázok lietadla - Analýza obrazu a videa v Pythone

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:

Kreslenie čiary na obrázok v Pythone - Analýza obrazu a videa v Pythone

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í:

Kreslenie vyplneného farebného štvorca na obrázok v Pythone - Analýza obrazu a videa v Pythone

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:

Analýza obrazu a videa v Pythone

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:

Kreslenie mnohouholníkov čiže polygónov na obrázky v Pythone - Analýza obrazu a videa v Pythone

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:

Vloženie textu na obrázok v Pythone - Analýza obrazu a videa v Pythone

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.

Analýza obrazu a videa v Pythone

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

 

Predchádzajúci článok
Úvod do analýzy obrazu a videa v Pythone
Všetky články v sekcii
Analýza obrazu a videa v Pythone
Preskočiť článok
(neodporúčame)
Práca s pixelmi a operácie s obrázkami v Pythone
Článok pre vás napísal MQ .
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Používám hlavně Python a zajímám se o Deep Learning a vše kolem.
Aktivity