Skip navigation

Kép beolvasása, megjelenítése és fájlba írása

Első példaprogram

Az első példaprogramunk betölt külső fájlból egy képet, megjeleníti, billentyűlenyomások után több tengely szerint tükrözi, és fájlba menti az eredményt. Futtassuk a programot és nézzük meg a hatását! Utána lépésenként bemutatjuk a forráskód felépítését.

01_01_ocv_image_io.py

# OpenCV2 képbeolvasás, megjelenítés és tükrözés
# OpenCV online dokumentáció: https://docs.opencv.org/

# OpenCV modul definíciók importálása
import cv2


# OpenCV verziószám kiíratása
print('OpenCV verzió:', cv2.__version__)


# Kép beolvasása fájlból
img = cv2.imread('OpenCV-logo.png', cv2.IMREAD_COLOR)


# Képméret kiíratása konzolra
print(img.shape)


# Kép megjelenítése ablakban
cv2.imshow('image', img)

cv2.waitKey(0)

# Tükrözés a függőleges középtengelyre és megjelenítés
flipped = cv2.flip(img, 1)

cv2.imshow('image', flipped)
cv2.imwrite('OpenCV-logo-flipped.png', flipped)
cv2.waitKey(0)


# Tükrözés mindkét középtengelyre és megjelenítés
flipped2 = cv2.flip(img, -1)

cv2.imshow('image', flipped2)
cv2.waitKey(0)

# Összes ablak bezárása
cv2.destroyAllWindows()

Kezdő lépések

Az OpenCV Python nyelvből való használatához szükséges csomagként való előzetes telepítése. Ha ez megtörtént, akkor a programunk elején beilleszthetjük a definíciókat az import paranccsal. Az OpenCV csomag neve cv2, ezen keresztül érhetjük majd el a függvényeket és a definíciókat. Például a csomagban definiált __version__ nevű sztring változó az OpenCV verziószámát adja, amit a programunkban a print() függvénnyel ki is íratunk a konzolra.

Digitális képek rendszerint külső fájlból érkeznek a programjainkba, ahol feldolgozzuk, és közben megjelenítjük őket. Kép beolvasásra a cv2.imread() függvény használható. Paraméterként a beolvasandó fájl nevét kell megadnunk. Ez tartalmazhat akár teljes vagy relatív elérési utat is. Ha ilyet nem adunk meg, akkor a képfájlnak a programunkkal azonos könyvtárban kell elhelyezkednie. Az elterjedt PNG és JPG fájlok kezelése támogatott. A cv2.imread() függvény további paraméterezésével a szürkeárnyalatos konverziónál ismerkedünk majd meg.

A beolvasás eredménye egy n-dimenziós Numpy tömb lesz. Ennek megkaphatjuk a dimenzióit a shape attribútumával.

Az OpenCV képmegjelenítő függvénye a cv2.imshow(). A kép önálló ablakban jelenik meg.

  • A függvény első paramétere egy sztring, amely egyrészt az ablak fejlécében lesz látható, másrészt ez fogja egyértelműen azonosítani az ablakot. Az OpenCV ugyanis egyszerre akár sok képablak kezelését is el tudja végezni, vagyis az azonosítás fontos. Ebből következik, hogy nem tudunk két egyező nevű ablakot létrehozni. Ha adott nevű ablak még nem létezik, akkor az OpenCV létrehozza és megjeleníti. Ha létezik, akkor a tartalmát cseréli le.
  • A második paraméter a megjelenítendő, Numpy reprezentációjú kép.
  • További ablakkezelő függvényekről a függelékben olvashatunk.

cv2.imshow() függvény végrehajtása után a programunk futása rögtön folytatódik. A program kilépésekor minden ablak eltűnik. Emiatt szükséges, hogy egyes eredmények megjelenítése után várakozzunk a folytatásra. Legegyszerűbben a cv2.waitKey() függvénnyel tehetjük ezt meg. A nevéből kitalálható, hogy billentyűlenyomásra vár. Másrészt megadhatunk egy egész számértéket paraméterként, ami a maximális várakozási időt adja meg ezredmásodpercben. Ha addig nem történik billentyűlenyomás, akkor visszatér. A cv2.waitKey() visszaadja a lenyomott billentyű kódját is, de ezzel egyelőre nem foglalkozunk. (A cv2.waitKey() függvény részletes ismertetése a függelékben megtalálható.)

Az OpenCV számos függvényt biztosít a képmátrixok módosítására. Az egyik legegyszerűbb a kép tükrözése különféle középtengelyeire. Ezt a cv2.flip() függvény végzi. Első paramétere a tükrözendő kép. Második paramétere a tükrözés módját adja meg. Egész számot kell átadnunk. Ha értéke pozitív (példánkban 1), akkor a függőleges középtengelyre tükröz. 0 érték esetén a vízszintes középtengelyt használja, negatív érték esetén pedig mindkettőre tükröz. Eredménye egy új Numpy tömb lesz.

Képet a cv2.imwrite() függvénnyel írhatunk ki fájlba. Első paramétere a kiírandó fájl neve, akár elérési úttal, hasonlóan a beolvasáshoz. A fájl formátumát a kiterjesztés alapján határozza meg. Célszerű png vagy jpg kiterjesztést választani. A második paraméter a kiírandó képet reprezentáló Numpy tömb.

A cv2.destroyAllWindows() függvény az összes OpenCV képablakot bezárja. A program legvégén ezt célszerű használnunk, hogy érvényes visszatérési kóddal térjen vissza a programunk.

Feladatok

1. feladat: Végezzük el az alábbi módosításokat az első példaprogramon!

  • Az egyes képek megjelenése után legkésőbb 2 másodperc (azaz 2000 ezredmásodperc...) után lépjen a következő eredményre a program!
  • A bemeneti kép és a tükrözött eredmények külön ablakokban jelenjenek meg!

2. feladat: Tegyük billentyűzetről vezérelhetővé az első példaprogramot!

  • A program a H billentyű lenyomására vízszintesen, a V billentyű lenyomására függőlegesen tükrözze a képet! A ciklusból a Q vagy az ESC billentyű lenyomásával léphessünk ki! (Ötlet: A függelékben a waitKey() függvény bemutatásánál szerepel erre használható kódrészlet.)
  • A műveletek az éppen aktuális képmátrixra vonatkozzanak!

3. feladat: Bővítsük a 2. feladatban elkészített programunkat kép transzponálással (sorok és oszlopok cseréje)!

  • Használjuk a cv2.transpose() függvényt! A transzponálás a T billentyű lenyomására hajtódjon végre az éppen aktuális képmátrixon!
  • Az angol nyelvű dokumentációban keressünk rá a függvényre, hogy mi a paraméterezése! (Súgó: Egyedül a transzponálandó képet kell paraméterként átadnunk, eredményként a módosítottat kapjuk vissza.)
  • Próbáljuk ki a PyCharm függvény fejléc segítségét: menjünk a cv2.transpose() függvény paraméterlistájába a kurzorral (a függvény neve utáni zárójelek közé) és nyomjuk meg a CTRL+P-t. (Ha ez a funkció nem működik, akkor itt olvasható egy lehetséges megoldás.)

4. feladat: Kép forgatása balra és jobbra 90 fokkal

Gyakori probléma, hogy a kép készítésekor a kamera állása nem megfelelő, így 90 fokkal elforgatott képet kapunk. Bővítsük az előző programunkat úgy, hogy korrigálni tudjuk ezt!

  • A cv2.flip() és a cv2.transpose() függvények megfelelő kombinációjával biztosítsunk lehetőséget a képmátrix 90 fokkal való balra és jobbra forgatására!
  • Az R és L billentyűkkel érhessük el ezeket a funkciókat. A műveletek az éppen aktuális képmátrixra vonatkozzanak!
  • A 3. feladat programjával tapasztaljuk ki, milyen sorrendben kell az egyes műveleketet elvégeznünk a megfelelő forgatásokhoz.
  • A megoldáshoz a cv2.rotate() is használható. Keressük meg a dokumentációban a használatát!

5. feladat: Készítsünk animált megjelenítést!

  • A program másodpercenként váltogatva tükrözze a képet, amíg a Q vagy az ESC billentyű lenyomásával ki nem lépünk a ciklusból!
  • A korábban hivatkozott függelék fejezet erre is ad megoldási ötletet.