본문 바로가기

코딩 학습/Python

[Python] 키보드 입력시 처리 구문 cv2.waitKey() & 0xFF == ord()

파이썬을 이용한 이미지 처리를 하다가 키보드를 입력할 시, 행동을 하는 구문을 찾았는데, 워낙 이해가 안가다가 겨우겨우 찾아서 내용을 정리해둔다.

 

먼저, 문제가 된 구문은 https://suy379.tistory.com/90

 

Python OpenCV (1) - 이미지, 동영상 데이터를 불러오고 저장하기

안녕하세요, Everly입니다 :) 지금까지 한 포스팅으로 현장에서 데이터 분석 업무를 어떻게 하는지, 어떻게 결과를 내고 개선하는지에 대한 내용을 알아봤습니다. 지금부터는 '발전 편'으로, 이미

suy379.tistory.com

해당 게시물의 

while(cap.isOpened()):
	ret, frame = cap.read()
    if ret:
    	cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
    	break

의 두번째 if 문의 조건이다.

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

 

첫번째로

여기서 사용된 처음 본 함수를 보면

 

- waitKey() : 키 입력을 기다리는 함수로 openCV라이브러리에 포함된 함수 이다, 내부의 숫자는 키 입력을 기다리는 대기 시간을 의미한다.

  • 0 : 무한 대기
  • 정수 : 입력한 숫자의 ms(밀리 세컨드) 만큼 대기
  • 리턴값 : 입력된 키 값의 아스키 코드 숫자(num

 

- ord() : 내부에 적힌 문자를 아스키코드 정수로 변환하여 반환하는 함수 이다.

  ex) ord('q') = 113, ord('a') = 97

 

두번째로

이번 문제의 주 원인은 여러 언어를 갈아타면서 닥치는 대로 배우고 개발하다보니

'비트 연산자 &' 와 'and 연산자(&& 혹은 &)'

에서 익숙한 and 연산자로 이해했기 때문이다.

때문에 [cv2.waitKey(1)] & [0xFF == ord('q')] 이런식으로 이해를 했기에 "255(0xFF, 16진수)가 ord('q')랑 왜 같은지 보는거지?")를 한창 고민을 했었다.

그런데, 알고 보니, 비트 연산을 수행했어야 했다.

 

 

(0b 의 의미는 2진수라는 의미다. ex 0b10 = 10(2) = 2)

(0x 의 의미는 16진수라는 의미다.)

근데, waitKey만으로도 0b01110001이 나오는데 왜 굳이 0xFF와 비트 연산을 통해서 또 걸러야 하느냐는 현재 확인하기로는 '과거'에 waitKey가 NumLock과 같은 일부 특수 키가 켜져있냐 아니냐의 여부에 따라서 아래와 같이 다르게 나왔다고 한다. (둘다 'q'입력시) (현재는 NumLock에 영향 받지 않는다, 2016년에 함수 업데이트 된것으로 판단됨)

  • (NumLock 미적용시) waitKey() ->  0b01110001
  • (NumLock 적용시) -> 0b1000000000000001110001

그런데, 자세히 보면 뒤의 8자리는 동일하게 나옴을 볼 수 있다. 때문에, 영어 키보드의 경우, 255를 넘지 않음을 이용해서 8비트 숫자의 상수 (0xFF = 0b11111111) 과 비트연산을 수행하여 언제나 ord('q')와 비교하기 적합하도록 변경해주는 역할을 한다.

 

 

'코딩 학습 > Python' 카테고리의 다른 글

[Python] 파이참 가상환경 생성 및 실행 과정  (0) 2022.12.27