Skip navigation

Billentyűzet kezelése

Lehetőségei

Az OpenCV a waitKey() és waitKeyEx() függvényeket biztosítja a lenyomott billentyűkódok kezelésére.

  • Mindkét függvény paraméterként egy egész számot vár. A billentyű lenyomásra várakozás a megadott ezredmásodperc letelte után véget ér, illetve korábban akkor, amennyiben történt billentyű lenyomás. Ha 0 értéket adunk át, akkor nincs időkorlát, csak egy billentyű lenyomásakor tér vissza, tartson az bármeddig.
  • Eredményképpen -1 értéket kapunk, ha nem volt billentyű lenyomva a megadott időtartam alatt, illetve a lenyomott billentyű kódját, amennyiben igen.

A waitKey() ASCII kódot ad vissza. A probléma ezzel az, hogy a speciális billentyűk (nyilak, Home, End, stb.) nem rendelkeznek ilyennel, így azokra 0 értéket kapunk.

A waitKeyEx() a lenyomott gomb teljes kódját adja, viszont ez az ablakozást megvalósító keretrendszertől (Qt, GTK, Windows, ...) függő érték lesz!

Ellenőrzéshez jól használható a Python ord() függvénye, amely a paraméterként átadott karakter ASCII kódját adja vissza. Ha a lenyomott billentyű karaktert szeretnénk sztringben szerepeltetni, akkor a chr() Python függvénnyel tehetjük ezt meg. Használatukra a példaprogramban látunk példát.

B_01_waitKey.py

A példaprogram a billentyűzet-kezelésre mutat példákat.

Először beillesztjük az OpenCV definíciókat, betöltjük a OpenCV-logo tesztképet színes képként, és megjelenítjük ablakban. A billentyűzet figyelés megjelenített ablak esetén működik megfelelően, mégha ablakhoz nem is kapcsolódik a definíciója.

import cv2

im = cv2.imread('OpenCV-logo.png', cv2.IMREAD_COLOR)
cv2.imshow('image', im)

A következő részben tájékoztató szöveg kerül kiírásra, majd időkorlát nélkül várunk egy billentyű lenyomására. Megtörténte után kiírjuk a karaktert és annak kódját a konzolra.

print('Várakozás billentyű lenyomásig, időkorlát nélkül')
key = cv2.waitKey(0)
print('Lenyomott billentyű és kódja:', chr(key), key)

Ezután maximum 5 másodpercet várunk. Megvizsgáljuk a visszatérési értéket, ami alapján eldönthető, volt a billentyű lenyomás, vagy az időkorlát telt le.

print('Várakozás billentyű lenoymásra, maximum 5 másodpercig')
key = cv2.waitKey(5000)
if key != -1:
print('Lenyomott billentyű és kódja:', chr(key), key)
else:
print('Nem volt lenyomott billentyű!')

Az utolsó példa azt mutatja be, hogyan lehet a billentyűzet lenyomást ismétlődő ciklusba szervezni, és inaktivitás esetén háttérfolyamatot végezni. A cél, hogy 1 tizedmásodpercenként a kép középpontja körül elforgatjuk a képet, ha más nem történik. A q és az ESC billentyűkkel léphetünk ki a ciklusból, míg az r billentyű a forgás irányát változtatja. A többi billentyű lenyomása nem okoz semmilyen hatást. Bár ebben a példában nem szükséges, a waitKeyEx() függvényt használjuk, ha esetleg funkcióbillentyű lenyomásokat is szeretnénk kezelni.

h, w, d = im.shape
angle = 0
step = 1.0
print('Billentyűzet-figyelő ciklus')

print('Forgási irány váltás: r')
print('Kilépés: q vagy ESC')

while True:
key = cv2.waitKeyEx(100)
if key == -1:
# Nem volt lenyomott billentyű, de végezhetünk valamilyen háttértevékenységet
rot_M = cv2.getRotationMatrix2D((w / 2, h / 2), angle, 1.0)

rot_im = cv2.warpAffine(im, rot_M, (w, h))
cv2.imshow('image', rot_im)
angle += step
continue

if key == 27 or key == ord('q'):

break

if key == ord('r'):

step = -step

print('Lenyomott billentyű és kódja:', chr(key), key)

A program befejező részében bezárjuk a képmegjelenítő ablakot.

cv2.destroyAllWindows()