openCV : cv2.waitKey bug

2022. 10. 21. 13:15·Programming
728x90
728x90

아래 글은 WSL2에서 WSLg의 버전이 낮을 경우 발생함.

WSL에서의 2022.10 당시 위의 문제를 해결한 상태임.

다음 글 참조.

https://bme808.blogspot.com/2022/10/cv2waitkey-wsl.html

 

cv2.waitkey 가 wsl에서 잘 안동작하던 문제 해결.

결론부터 애기하면, wslg version이 낮아서 발생한 문제였음. WSLg 버전이 1.0.45 로 업그레이드하면 해당 에러는 해결됨. 설치를 위해선 Windows Subsystem for Linux Preview 설치(MS store...

bme808.blogspot.com

업그레이드를 할 수 없는 경우라면 다음을 참고(근원적인 해결이 아닌 순간적인 모면책에 불과함).


WSL2에서 openCV를 이용한 간단한 gui를 작성하던 중 cv2.waitKey(100) 이 정상동작을 하지 않아 꽤 짜증이 났다.

 

일반적으로 cv2.imshow를 사용하는 경우, 화면을 닫기 위해서 `ESC`키 입력을 받아서 처리하는데....

한번은 정상동작하지만, 해당 코드로 종료한 이후 다시 시작하면, cv2.waitKey()에서 계속해서 ESC키에 해당하는 코드(27)을 반환한다. ==;;

 

널리 사용되는 code는 다음과 같음.

while True:
    cv2.imshow('image',img)
    if cv2.waitKey(20) & 0xFF == 27 : # enter ESC
        break
cv2.destroyAllWindows()

ESC키만의 문제인가 싶어서 q를 입력받아 종료하는 경우도 역시 한번만 동작하고 q에 해당하는 코드를 계속반환했다.
이 테스트로 사용한 코드는 다음과 같음.

while True:
    cv2.imshow('image',img)
    key = cv2.waitKey(500)
    print(key)
    if key & 0xFF == ord('q') : # enter ESC
        print(key)
        break
cv2.destroyAllWindows()
  • wait time을 아무리 0부터 1000까지 바꿔봐야 문제가 해결되지 않는다.
  • 이전 종료한 키 값이 반환이 되지만, 이후 다른 키를 입력하여 처리하면 다시 정상적으로 동작함.
  • 하지만 종료에 누른 키값을 다음번 동작시 계속해서 토해낸다. ==;;
  • 인위적으로 키 이벤트를 다른 것으로 넣어주면 될까 했는데... 역시 동작하지 않음.

이미 같은 문제로 여러 글이 인터넷에 올라온 상태였고...
WSL의 버그라는 의견이 꽤 있었다.

결국, 종료코드를 다음으로 수정하여 윈도우 메뉴의 x버튼을 클릭하는 것으로 수정했다.

while True:
    cv2.imshow('image',img)
    key = cv2.waitKey(500)
    print(key)
    # if is_first:
    #     key = cv2.waitKey(10)
    #     keyboard.press('a')
    #     key = cv2.waitKey(10)
    #     is_first=False
    #     continue
    # if key & 0xFF == 27 : # enter ESC
    #     print(key)
    #     break

    if cv2.getWindowProperty('image', cv2.WND_PROP_VISIBLE ) <1:
        break;
# cv2.destroyAllWindows() 
cv2.destroyWindow('image')

모든 경우에서 종료후 Segmentation fault가 나기 때문에, 해결이 아닌 임시방편으로 보인다.
간단한 예제는 문제 없지만 util개발할 때 귀찮은 점이 생길 듯...

 

 

 

'Programming' 카테고리의 다른 글

[PyQt6] Install PyQt6 on Windows  (2) 2023.01.03
[CE] Introduction of WSL  (0) 2022.12.22
[NumPy] sorting: 정렬  (1) 2022.09.10
Paradigm (패러다임)  (0) 2022.07.21
[Python] 현재 사용 중인 Python 및 패키지의 실제 경로 확인하기.  (2) 2022.07.18
'Programming' 카테고리의 다른 글
  • [PyQt6] Install PyQt6 on Windows
  • [CE] Introduction of WSL
  • [NumPy] sorting: 정렬
  • Paradigm (패러다임)
dsaint31x
dsaint31x
    반응형
    250x250
  • dsaint31x
    Dsaint31's blog
    dsaint31x
  • 전체
    오늘
    어제
    • 분류 전체보기 (740)
      • Private Life (13)
      • Programming (186)
        • DIP (104)
        • ML (26)
      • Computer (119)
        • CE (53)
        • ETC (33)
        • CUDA (3)
        • Blog, Markdown, Latex (4)
        • Linux (9)
      • ... (351)
        • Signals and Systems (103)
        • Math (172)
        • Linear Algebra (33)
        • Physics (42)
        • 인성세미나 (1)
      • 정리필요. (54)
        • 의료기기의 이해 (6)
        • PET, MRI and so on. (1)
        • PET Study 2009 (1)
        • 방사선 장해방호 (4)
        • 방사선 생물학 (3)
        • 방사선 계측 (9)
        • 기타 방사능관련 (3)
        • 고시 (9)
        • 정리 (18)
      • RI (0)
      • 원자력,방사능 관련법 (2)
  • 블로그 메뉴

    • Math
    • Programming
    • SS
    • DIP
  • 링크

    • Convex Optimization For All
  • 공지사항

    • Test
    • PET Study 2009
    • 기타 방사능관련.
  • 인기 글

  • 태그

    signals_and_systems
    math
    function
    random
    Python
    numpy
    fourier transform
    Term
    Probability
    Optimization
    SIGNAL
    signal_and_system
    SS
    Programming
    opencv
    DIP
    linear algebra
    Convolution
    인허가제도
    Vector
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dsaint31x
openCV : cv2.waitKey bug
상단으로

티스토리툴바