복붙노트

[PYTHON] cv2.waitKey (1)의 0xFF는 무엇입니까?

PYTHON

cv2.waitKey (1)의 0xFF는 무엇입니까?

0xFF가 다음 코드 스 니펫에서 다루는 내용을 이해하려고 노력 중입니다.

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

어떤 아이디어?

해결법

  1. ==============================

    1.0xFF는 2 진수로 11111111 인 16 진수 상수입니다. 이 상수와 비트 AND (&)를 사용하면 원본의 마지막 8 비트 (이 경우 cv2.waitKey (0)가 무엇이든간에) 만 남습니다.

    0xFF는 2 진수로 11111111 인 16 진수 상수입니다. 이 상수와 비트 AND (&)를 사용하면 원본의 마지막 8 비트 (이 경우 cv2.waitKey (0)가 무엇이든간에) 만 남습니다.

  2. ==============================

    2.NumLock이 활성화되어 있다면 ord ( 'q')가 다른 숫자를 반환 할 수 있다는 점도 중요합니다 (아마도 다른 키에서도 발생하고있을 수 있습니다). 예를 들어, c를 누르면 코드는 다음과 같습니다.

    NumLock이 활성화되어 있다면 ord ( 'q')가 다른 숫자를 반환 할 수 있다는 점도 중요합니다 (아마도 다른 키에서도 발생하고있을 수 있습니다). 예를 들어, c를 누르면 코드는 다음과 같습니다.

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

    보고

     1048675 when NumLock is activated 
     99 otherwise
    

    이 2 개의 수를 2 진수로 변환하면 다음을 볼 수 있습니다.

    1048675 = 100000000000001100011
    99 = 1100011
    

    보시다시피, 마지막 바이트는 동일합니다. 그런 다음 NumLock의 상태 때문에 나머지가 발생하기 때문에이 마지막 바이트 만 가져와야합니다. 따라서 다음을 수행합니다.

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

    열쇠의 가치는 동일하게 유지 될 것이고 이제 우리는 당신의 질문과 같은 우리가 원하는 어떤 열쇠와도 비교할 수 있습니다.

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

    3.cv2.waitKey ()는 32 비트 정수 값을 반환합니다 (플랫폼에 따라 다를 수 있음). 키 입력은 ASCII로 8 비트 정수 값입니다. 따라서이 8 비트에만 관심을 갖고 다른 모든 비트는 0이되기를 원합니다. 다음과 같이 구현할 수 있습니다.

    cv2.waitKey ()는 32 비트 정수 값을 반환합니다 (플랫폼에 따라 다를 수 있음). 키 입력은 ASCII로 8 비트 정수 값입니다. 따라서이 8 비트에만 관심을 갖고 다른 모든 비트는 0이되기를 원합니다. 다음과 같이 구현할 수 있습니다.

    cv2.waitKey(0) & 0xFF
    
  4. ==============================

    4.사실이 경우에는 0xFF가 필요하지 않습니다. cv2.waitkey (0) == ord (q)를 수행했다면 똑같이 작동합니다. 0xFF는 시퀀스의 마지막 8 비트를 마스크하는 데 사용되며 키보드 문자의 ord ()는 255보다 클 수 없습니다.이 ASCII 테이블을 참조하여 키보드 문자의 숫자 값을 찾을 수 있습니다.

    사실이 경우에는 0xFF가 필요하지 않습니다. cv2.waitkey (0) == ord (q)를 수행했다면 똑같이 작동합니다. 0xFF는 시퀀스의 마지막 8 비트를 마스크하는 데 사용되며 키보드 문자의 ord ()는 255보다 클 수 없습니다.이 ASCII 테이블을 참조하여 키보드 문자의 숫자 값을 찾을 수 있습니다.

  5. ==============================

    5.ord (c)는 인수가 유니 코드 객체 일 때 문자 (c)의 유니 코드 코드 포인트를 나타내는 정수 또는 인수가 8 비트 문자열 인 경우 바이트 값을 반환합니다.

    ord (c)는 인수가 유니 코드 객체 일 때 문자 (c)의 유니 코드 코드 포인트를 나타내는 정수 또는 인수가 8 비트 문자열 인 경우 바이트 값을 반환합니다.

    64 비트 시스템의 경우 cv2.waitKey (0)의 값은 0xFF 16 진수 상수 (이진 문자열 11111111의 표현)와 비트 AND (&)하여 마지막 8 비트가됩니다. 따라서 ord (c)로 eqality를 확인하십시오.

  6. ==============================

    6.이 코드에서,

    이 코드에서,

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

    입력이 없으면 waitKey (0) 함수는 -1을 반환합니다. 이벤트가 발생하자마자 즉, 버튼을 누르면 32 비트 정수가 반환됩니다.

    이 시나리오의 0xFF는 이진수 11111111을 8 비트 바이너리로 나타냅니다. 우리는 AND와 waitKey (0) ~ 0xFF 문자를 나타내는 데 8 비트 만 필요하기 때문입니다. 결과적으로 255보다 작은 정수가 얻어집니다.

    ord (char)는 다시 최대 255가 될 문자의 ASCII 값을 반환합니다.

    따라서 정수를 ord (char) 값과 비교하여 키 누름 이벤트를 확인하고 루프를 중단 할 수 있습니다.

  7. from https://stackoverflow.com/questions/35372700/whats-0xff-for-in-cv2-waitkey1 by cc-by-sa and MIT license