wake-up-neo.com

Was ist 0xFF für cv2.waitKey (1)?

Ich versuche zu verstehen, was 0xFF unter der Haube im folgenden Codeausschnitt bewirkt:

if cv2.waitKey(0) & 0xFF == ord('q'):
    break

Irgendwelche Ideen?

24
Dora

0xFF ist eine hexadezimale Konstante, die binär 11111111 ist. Durch die Verwendung von bitweisem AND (&) mit dieser Konstante bleiben nur die letzten 8 Bits des Originals (in diesem Fall das, was cv2.waitKey(0) ist) bestehen.

17
Kevin W.

Beachten Sie auch, dass ord ('q') andere Zahlen zurückgeben kann, wenn Sie NumLock aktiviert haben (möglicherweise geschieht dies auch mit anderen Tasten). Wenn Sie beispielsweise c drücken, lautet der Code:

key = cv2.waitKey(10) 
print(key) 

kehrt zurück 

 1048675 when NumLock is activated 
 99 otherwise

Wenn Sie diese beiden Zahlen in Binärzahlen konvertieren, können Sie Folgendes sehen:

1048675 = 100000000000001100011
99 = 1100011

Wie wir sehen können, ist das letzte Byte identisch. Dann muss nur dieses letzte Byte genommen werden, da der Rest aufgrund des Zustands von NumLock verursacht wird. So führen wir aus:

key = cv2.waitKey(33) & 0b11111111  
# 0b11111111 is equivalent to 0xFF

und der Wert des Schlüssels bleibt derselbe und jetzt können wir ihn mit jedem beliebigen Schlüssel wie Ihrer Frage vergleichen

if key == ord('q'):
36
Sheila

cv2.waitKey () gibt einen ganzzahligen 32-Bit-Wert zurück (hängt von der Plattform ab). Die Tasteneingabe erfolgt in ASCII, einem ganzzahligen 8-Bit-Wert. Sie kümmern sich also nur um diese 8 Bits und möchten, dass alle anderen Bits 0 sind. Dies erreichen Sie mit:

cv2.waitKey(0) & 0xFF
16
johnny b

Ehrlich gesagt brauchen Sie in diesem Fall kein 0xFF. Wenn Sie cv2.waitkey(0) == ord(q) gemacht haben, würde es trotzdem funktionieren. 0xFF wird nur verwendet, um den letzten 8bits der Sequenz zu maskieren. Das ord () eines beliebigen Tastaturzeichens ist nicht größer als 255. Sie können auf diese ASCII - Tabelle verweisen, um die numerischen Werte von any zu ermitteln Tastaturzeichen.

3
Daniel Copley

ord (c) gibt eine Ganzzahl zurück, die den Unicode-Codepunkt des Zeichens (c) darstellt, wenn das Argument ein Unicode-Objekt ist, oder der Wert des Bytes, wenn das Argument eine 8-Bit-Zeichenfolge ist. 

Bei 64-Bit-Systemen ist der Wert von cv2.waitKey (0) bitweise AND (&) mit der resultierenden 0xFF - Hexadezimal-Konstante (die Darstellung der Binärzeichenfolge 11111111) in den letzten 8 Bits davon. Daher wird die Gleichheit mit ord (c) überprüft.

2
jaykay

In diesem Code

                   if cv2.waitKey(0) & 0xFF == ord('q'):
                       break

Die Funktion waitKey(0) gibt -1 zurück, wenn überhaupt keine Eingabe erfolgt. Sobald das Ereignis auftritt, d. H. Ein Button wird gedrückt, wird eine 32-Bit-Ganzzahl zurückgegeben.

Der 0xFF repräsentiert in diesem Szenario das binäre 11111111 a 8 bit binary, da wir nur 8 Bit benötigen, um ein Zeichen darzustellen, das wir UND waitKey(0) in 0xFF darstellen. Als Ergebnis erhält man eine ganze Zahl unter 255.

ord(char) gibt den ASCII - Wert des Zeichens zurück, der wiederum maximal 255 sein würde. 

Durch den Vergleich der Ganzzahl mit dem ord(char)-Wert können wir also prüfen, ob ein Ereignis auf einer Taste gedrückt wird, und die Schleife unterbrechen.

1
Kuldeep Thakre