web-dev-qa-db-fra.com

A quoi sert 0xFF dans cv2.waitKey (1)?

J'essaie de comprendre ce que 0xFF fait sous le capot dans l'extrait de code suivant:

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

Des idées?

24
Dora

0xFF est une constante hexadécimale qui est 11111111 en binaire. En utilisant AND (&) au niveau du bit avec cette constante, il ne reste que les 8 derniers bits de l'original (dans ce cas, quel que soit cv2.waitKey(0)).

17
Kevin W.

Il est également important de noter que ord ('q') peut renvoyer des numéros différents si la fonction de verrouillage numérique est activée (peut-être que cela se produit également avec d'autres touches). Par exemple, lorsque vous appuyez sur c, le code:

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

résultats 

 1048675 when NumLock is activated 
 99 otherwise

En convertissant ces 2 nombres en binaires, nous pouvons voir:

1048675 = 100000000000001100011
99 = 1100011

Comme on peut le constater, le dernier octet est identique. Ensuite, il est nécessaire de ne prendre que ce dernier octet, le reste étant dû à l'état de NumLock. Ainsi, nous effectuons:

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

et la valeur de la clé restera la même et nous pouvons maintenant la comparer à la clé de votre choix, telle que votre question.

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

cv2.waitKey () renvoie une valeur entière sur 32 bits (peut dépendre de la plate-forme). La clé est entrée dans ASCII, qui est une valeur entière de 8 bits. Donc, vous ne vous souciez que de ces 8 bits et souhaitez que tous les autres bits soient 0. Vous pouvez y parvenir avec:

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

En vérité, dans ce cas, vous n'avez pas besoin de 0xFF. Si vous faisiez cv2.waitkey(0) == ord(q) cela fonctionnerait tout de même. 0xFF est simplement utilisé pour masquer le dernier 8bits de la séquence et la valeur ord () de tout caractère du clavier ne sera pas supérieure à 255. Vous pouvez référencer ce tableau ASCII pour trouver les valeurs numériques de tout caractère. caractère de clavier.

3
Daniel Copley

ord (c) renvoie un entier représentant le point de code Unicode du caractère (c) lorsque l'argument est un objet Unicode ou la valeur de l'octet lorsque l'argument est une chaîne de 8 bits. 

Dans le cas des systèmes 64 bits, la valeur de cv2.waitKey (0) est bitwise AND (&) avec la constante 0xFF hexadécimale (qui représente la chaîne binaire 11111111) dans les 8 derniers bits de celui-ci. Vérifiant ainsi l’égalité avec ord (c).

2
jaykay

Dans ce code,

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

La fonction waitKey(0) renvoie -1 en l'absence de toute entrée. Dès que l’événement se produit c’est-à-dire qu’un bouton est enfoncé, il retourne un entier - 32 bits .

Le 0xFF dans ce scénario représente le binaire 11111111 a 8 bits binaire, car nous n'avons besoin que de 8 bits pour représenter un caractère que nous AND ET waitKey(0) à 0xFF. En conséquence, un entier est obtenu inférieur à 255.

ord(char) renvoie la valeur ASCII du caractère qui serait de nouveau 255 au maximum. 

Par conséquent, en comparant l'entier à la valeur ord(char), nous pouvons rechercher un événement touche enfoncé et rompre la boucle.

1
Kuldeep Thakre