Как работает cv2.waitKey(1) & 0xff == ord('q')?

Как работает эта линия?

Насколько мне известно, вывод cv2.waitKey(number) для всех int чисел равен -1, а 0xff — это шестнадцатеричное число, равное 255 в десятичных числах.

-1 & 0xff равно 255 в десятичных числах.

Кроме того, ord('q') равно 113.

Но теперь я не знаю, почему 255 == 113?


person Kourosh    schedule 28.08.2019    source источник
comment
& — это не логический оператор И, а битовая операция, обычно используемая для маскировки. Это означает взять первые 8 бит вызова waitKey() и сравнить их с битами ord("q").   -  person mike3996    schedule 28.08.2019
comment
Возможный дубликат Что такое 0xFF для cv2.waitKey(1)?   -  person walnut    schedule 28.08.2019
comment
Вы когда-нибудь решали эту проблему?   -  person Life is complex    schedule 12.02.2021


Ответы (2)


cv2.waitKey(1) возвращает код символа нажатой в данный момент клавиши и -1, если клавиша не нажата. & 0xFF — это двоичная операция И, обеспечивающая сохранение только однобайтового (ASCII) представления ключа, поскольку для некоторых операционных систем cv2.waitKey(1) будет возвращать код, который не является одним байтом. ord('q') всегда возвращает ASCII-представление 'q', равное 113 (0x71 в шестнадцатеричном формате).

поэтому, если пользователь нажимает клавишу q во время оценки cv2.waitKey(1), будет определено следующее:

cv2.waitKey(1) & 0xFF == cv2.ord('q')
0xXX71 & 0xFF == 0x71
0x71 == 0x71
True
person Joseph Holland    schedule 28.08.2019

Я только что закончил код OpenCV, и cv2.waitKey(1) & 0xff == ord('q') был одним из элементов, с которыми я играл несколько раз.

Во-первых:

cv2.waitKey([задержка])

Функция waitKey ожидает события клавиши бесконечно, и задержка составляет миллисекунды. waitKey(0) означает навсегда.

Второе:

Метод ord() возвращает целое число, представляющее кодовую точку Unicode для заданного символа Unicode. В вашем коде вы хотите, чтобы пользователь выбрал букву «q», которая переводится в значение Unicode «113».

Третье:

0xFF — шестнадцатеричная константа, равная 11111111 в двоичном формате. Он используется для маскирования последних 8 бит последовательности, а ord() любого символа клавиатуры не может превышать 255.

Вот код, который я использую, в котором не используется ord() или & 0xff.

def display_facial_prediction_results(image):
  # Display image with bounding rectangles
  # and title in a window. The window
  # automatically fits to the image size.
  cv2.imshow('Facial Prediction', image)

  while (True):
    # Displays the window infinitely
    key = cv2.waitKey(0)

    # Shuts down the display window and terminates
    # the Python process when a specific key is
    # pressed on the window.
    # 27 is the esc key
    # 113 is the letter 'q'
    if key == 27 or key == 113:
        break
  cv2.destroyAllWindows()
person Life is complex    schedule 28.08.2019