Seite 1 von 1
cv2.waitKey-Funktion liest Tastatureingabe nicht
Verfasst: Donnerstag 29. Dezember 2022, 16:45
von joedu
Hallo,
kann mir jemand vielleicht weiterhelfen und mir sagen, woran es liegt, dass im nachfolgenden Code die Schleife nicht unterbrochen wird, wenn ich die Taste 'q' drücke?
Mit der Codezeile
key = cv.waitKey(1) & 0XFF wird der Tastendruck nicht eingelesen. Wenn ich key ausgebe, ist der Wert immer -1.
Code: Alles auswählen
from time import sleep
from picamera import PiCamera
import cv2 as cv
cam = PiCamera(resolution='HD')
try:
cam.start_preview(fullscreen=False, window=(100, 100, 640, 480))
i = 0
sleep(1) # camera warm-up time
while True:
cam.capture("img" + str(i) + ".jpg")
i += 1
sleep(.5) # take pic intervall
key = cv.waitKey(1) & 0XFF
if key == ord("q"): # esc key
break
cam.stop_preview()
finally:
cam.close()
Schon mal im Voraus vielen Dank für die Unterstützung!
Gruß
JD
Re: cv2.waitKey-Funktion liest Tastatureingabe nicht
Verfasst: Donnerstag 29. Dezember 2022, 17:06
von __deets__
Die Funktion waitKey wartet nicht endlos. Sondern nur die angegebene Zeit in Millisekunden. Eine in deinem Fall, weil du das angegeben hast. Wenn dann keine Taste gedrückt war, liefert sie -1. Wenn du endlos/bis zum Tastendruck warten willst, musst du (glaube ich) 0 angeben.
Re: cv2.waitKey-Funktion liest Tastatureingabe nicht
Verfasst: Donnerstag 29. Dezember 2022, 17:11
von joedu
Mit '0' als Parameter habe ich auch schon ausprobiert.
Aber unabhängig davon kommt der doch wegen der Endlosschleife immer wieder da vorbei und wartet erneut 1 Sekunde auf die Eingabe. Oder nicht?
Re: cv2.waitKey-Funktion liest Tastatureingabe nicht
Verfasst: Donnerstag 29. Dezember 2022, 17:38
von __blackjack__
@joedu: Eine *Millisekunde*, und das funktioniert nur wenn auch tatsächlich ein Fenster mit OpenCV angezeigt wird, weil nur dann überhaupt die Ereigniswarteschleife des GUI-Systems durch diesen Aufruf bedient wird.
Wenn das der Fall wäre würde man auch das `sleep()` weglassen können und ``cv.waitKey(500)`` stattdessen verwenden.
Die Nummer in den Bildernamen würde ich mit führenden 0en auffüllen, damit bei lexikographischer Sortierung die Reihenfolge stimmt und nicht beispielsweise 10 vor 2 kommt.
Der Kommentar mit „esc“ ist falsch.
Das könnte so aussehen (natürlich immer noch mit dem ursprünglichen Problem):
Code: Alles auswählen
#!/usr/bin/env python3
from itertools import count
from time import sleep
import cv2 as cv
from picamera import PiCamera
def main():
with PiCamera(resolution="HD") as camera:
camera.start_preview(fullscreen=False, window=(100, 100, 640, 480))
sleep(1) # camera warm-up time
for filename in map("img{:05d}.jpg".format, count()):
camera.capture(filename)
if cv.waitKey(500) & 0xFF == ord("q"):
break
camera.stop_preview()
if __name__ == "__main__":
main()
Re: cv2.waitKey-Funktion liest Tastatureingabe nicht
Verfasst: Samstag 31. Dezember 2022, 10:13
von joedu
Eine *Millisekunde*, und das funktioniert nur wenn auch tatsächlich ein Fenster mit OpenCV angezeigt wird, weil nur dann überhaupt die Ereigniswarteschleife des GUI-Systems durch diesen Aufruf bedient wird.
Das war ein wichtiger Hinweis. Ich dachte, dass die Angabe - wie bei Sleep - in Sekunden erfolgt.
Es wird doch ein Fenster angezeigt mit einem Preview der Kamera. Und er durchläuft die Schleife ja auch immer und immer wieder.
Bin nur nicht sicher, ob das Preview-Fenster auch Fokus hat. Denn wenn nicht, wäre auch das der mögliche Grund, dass die Tastatureingabe nicht ankommt. Gibt es eine Methonde, um dem Fenster den Fokus zu geben, denn mit der Maus ist es nicht anwählbar.
Wenn das der Fall wäre würde man auch das `sleep()` weglassen können und ``cv.waitKey(500)`` stattdessen verwenden.
Richtig! Habe ich geändert.
Die Nummer in den Bildernamen würde ich mit führenden 0en auffüllen, damit bei lexikographischer Sortierung die Reihenfolge stimmt und nicht beispielsweise 10 vor 2 kommt.
Danke dafür! Macht so Sinn. Hatte das allerdings nur als Versuchscode. Aber in meiner produktiven Anwendung werde ich das gerne verwenden.
Der Kommentar mit „esc“ ist falsch.
Warum ist das falsch? Taste 'Q' ist doch die Taste für den Abbruch.
Re: cv2.waitKey-Funktion liest Tastatureingabe nicht
Verfasst: Samstag 31. Dezember 2022, 10:31
von __deets__
Und ist Q die Escape Taste? Wenn ja, hast du ein sehr ungewöhnliches Tastaturlayout. Wenn nicht, ist der Kommentar falsch.
Re: cv2.waitKey-Funktion liest Tastatureingabe nicht
Verfasst: Samstag 31. Dezember 2022, 11:41
von __blackjack__
@joedu: Es wird ein Fenster angezeigt, das hat aber nichts mit OpenCV zu tun.
Re: cv2.waitKey-Funktion liest Tastatureingabe nicht
Verfasst: Samstag 31. Dezember 2022, 11:54
von joedu
@ __blackjack__:
Es wird ein Fenster angezeigt, das hat aber nichts mit OpenCV zu tun.
Okay. Was wäre dann eine funktionierende Möglichkeit Tastatureingaben abzufragen?
Re: cv2.waitKey-Funktion liest Tastatureingabe nicht
Verfasst: Samstag 31. Dezember 2022, 11:56
von __deets__
Du musst ein Fenster von OpenCV erzeugen lassen. Das Preview ist von PiCamera. imshow ist das Kommando. Alles nach lesbar in der highgui-Dokumentation.