without segmentation color cielab python opencv hex

segmentation - python int to hex without 0x



¿Qué es 0xFF para en cv2.waitKey(1)? (6)

En este código,

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

La función waitKey(0) devuelve -1 cuando no se realiza ninguna entrada. Tan pronto como ocurre el evento, es decir, se presiona un botón que devuelve un entero de 32 bits .

El 0xFF en este escenario representa 11111111 binario y un binario de 8 bits , ya que solo necesitamos 8 bits para representar un carácter que AND waitKey(0) a 0xFF . Como resultado, se obtiene un número entero por debajo de 255.

ord(char) devuelve el valor ASCII del carácter que sería de nuevo máximo 255.

Por lo tanto, al comparar el número entero con el valor ord(char) , podemos verificar un evento que presiona una tecla y romper el bucle.

Estoy intentando entender qué hace 0xFF bajo el capó en el siguiente fragmento de código:

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

¿Algunas ideas?


Sinceramente, en este caso no necesitas 0xFF. Si cv2.waitkey(0) == ord(q) funcionaría igual. 0xFF solo se usa para enmascarar los últimos 8 8bits de la secuencia y el ord () de cualquier carácter del teclado no será mayor que 255. Puede consultar esta tabla ASCII para encontrar los valores numéricos de cualquier carácter del teclado.


También es importante tener en cuenta que ord (''q'') puede devolver números diferentes si tiene NumLock activado (quizás también esté sucediendo con otras teclas). Por ejemplo, al presionar c, el código:

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

devoluciones

1048675 when NumLock is activated 99 otherwise

Convirtiendo estos 2 números en binario podemos ver:

1048675 = 100000000000001100011 99 = 1100011

Como podemos ver, el último byte es idéntico. Entonces es necesario tomar solo este último byte, ya que el resto se debe al estado de Bloq Num. Así, realizamos:

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

y el valor de la clave seguirá siendo el mismo y ahora podemos compararlo con cualquier clave que nos gustaría, como su pregunta

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


cv2.waitKey () devuelve un valor entero de 32 bits (puede depender de la plataforma). La entrada clave está en ASCII, que es un valor entero de 8 bits. Así que solo te interesan estos 8 bits y quieres que todos los otros bits sean 0. Esto se puede lograr con:

cv2.waitKey(0) & 0xFF


0xFF es una constante hexadecimal que es 11111111 en binario. Al usar AND ( & ) a nivel de bit con esta constante, deja solo los últimos 8 bits del original (en este caso, cualquiera que sea cv2.waitKey(0) ).


ord (c) devuelve un entero que representa el punto de código Unicode del carácter (c) cuando el argumento es un objeto Unicode, o el valor del byte cuando el argumento es una cadena de 8 bits.

En el caso de sistemas de 64 bits, el valor de cv2.waitKey (0) es bit y AND (&) con la constante hexadecimal 0xFF (que es la representación de la cadena binaria 11111111 ) que resulta en los últimos 8 bits de la misma. Comprobando así la calidad con ord (c).