OpenCV je multiplatformní svobodná (licence Apache 2) knihovna pro práci s obrazem. Samotná knihovna je z velké části napsána v C++, ale poskytuje Python wrapper, díky kterému ji můžeme používat i v tomto oblíbeném jazyce. OpenCV používají stovky velkých firem pro zpracování obrazu z kamer, rozpoznání psaného textu nebo obličejů. Běžně se s touto knihovnou můžeme potkat i v akademické sféře. Jelikož je OpenCV optimalizováno pro výkon, dokáže fungovat i na GPU, konkrétně na architektuře CUDA. Na Python úrovni pak pracuje s datovou strukturou numpy.ndarray
.
Jak OpenCV nainstalovat?
Budeme předpokládat, že si pro následující úlohy vystačíme pouze s CPU a nebudeme potřebovat GPU. V tom případě stačí nainstalovat Python balíček opencv-python z pypi. V opačném případě je potřeba knihovnu zkompilovat pro konkrétní architekturu a operační systém. Pokud máte rádi Docker, doporučuji si vybrat nějaký z dostupných docker obrazů, které kromě OpenCV obsahují taky Jupyter notebook.
Načtení a zobrazení obrázku
Nejdříve si ukážeme, jakým způsobem se dá načíst a zobrazit obrázek ve standardním okně systému.
import cv2
image = cv2.imread("lena.jpg")
cv2.namedWindow("Display", cv2.WINDOW_AUTOSIZE)
cv2.imshow("Display", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Obrázek se načte pomocí cv2.imread()
do datové struktury np.array
. Vyrobí se okno, které je důležité nějakým způsobem pojmenovat, protože toto jméno pak slouží jako identifikátor okna. Program pomocí imshow()
obrázek vykreslí a přes waitKey(0)
počká na stisk klávesy. Po stisku klávesy se okno zavře. Všimněte si ne-příliš pythoního názvu funkcí a přístupu k objektům. Je to z toho důvodu, že OpenCV je původně C++ knihovna.
OpenCV v Dockeru - Jupyter Notebook
Abychom pro vykreslení okna nemuseli komunikovat mezi hostujícím desktopem a docker kontejnerem, je v tomto případě elegantnější použít Jupyter Notebook a knihovnu matplotlib.
from matplotlib import pyplot as plt
import cv2
img = cv2.imread("lena.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
OpenCV používá z historických důvodů výchozí barevný model BGR místo RGB, což může být ze začátku dost neintuitivní a při určitých jasových operacích je na to potřeba dávat si pozor. Pomocí funkce cvtColor()
však můžeme obrázek jednoduše převést do správného barevného modelu a pak jej zobrazit.