아래 글은 WSL2에서 WSLg의 버전이 낮을 경우 발생함.
WSL에서의 2022.10 당시 위의 문제를 해결한 상태임.
다음 글 참조.
https://bme808.blogspot.com/2022/10/cv2waitkey-wsl.html
업그레이드를 할 수 없는 경우라면 다음을 참고(근원적인 해결이 아닌 순간적인 모면책에 불과함).
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 |