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')


# 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 az 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. Az 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 az 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.

Az 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 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 waitKey() visszaadja a lenyomott billentyű kódját is, de ezzel egyelőre nem foglalkozunk. (A 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 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 az 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 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

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!
  • 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 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!

Bővítsük a programunkat kép transzponálással (sorok és oszlopok cseréje)!

  • A cv2.flip() függvény helyett használjuk a cv2.transpose()-t!
  • Az angol nyelvű dokumentációban keressünk rá a függvényre, hogy mi a paraméterezése.
  • 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 kurzurral (a függvény neve utáni zárójelek közé) és nyomjuk meg a CTRL+P-t.