cv2.waitKey-Funktion liest Tastatureingabe nicht

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
joedu
User
Beiträge: 4
Registriert: Donnerstag 29. Dezember 2022, 10:15

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
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
joedu
User
Beiträge: 4
Registriert: Donnerstag 29. Dezember 2022, 10:15

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
joedu
User
Beiträge: 4
Registriert: Donnerstag 29. Dezember 2022, 10:15

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.
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und ist Q die Escape Taste? Wenn ja, hast du ein sehr ungewöhnliches Tastaturlayout. Wenn nicht, ist der Kommentar falsch.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@joedu: Es wird ein Fenster angezeigt, das hat aber nichts mit OpenCV zu tun.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
joedu
User
Beiträge: 4
Registriert: Donnerstag 29. Dezember 2022, 10:15

@ __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?
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst ein Fenster von OpenCV erzeugen lassen. Das Preview ist von PiCamera. imshow ist das Kommando. Alles nach lesbar in der highgui-Dokumentation.
Antworten