AI Track/CV
[openCV] cv2.imshow 창이 안뜨는 문제 해결
쫑쫑JJONG
2022. 11. 9. 02:54
728x90
1. 문제상황
while cv2.waitKey(33) < 0:
_, src = cap.read() #영상파일 읽어드리기
cv.imshow("Original", src) #원본 화면
check = Yellow_bell_detect(src,yellow1,yellow2,yellow_chance) #인식 o :51 /// 인식 x :50
sleep(0.08)
cap.release()
cv2.destroyAllWindows()
저렇게 코딩을 하였더니 함수처리 시간 때문에
카메라가 뚝뚝 끊기는 현상이 발생
아이디어 : Thread를 이용해보자
############## 제어보드로부터 수신받기 시작 ##############
serial_t = Thread(target=Receiving, args=(serial_port, cap,))
serial_t.daemon = True # 수신을 하는 스레드는 데몬 스레드
serial_t.start()
time.sleep(0.1)
#-------------------------------------
############## 카메라 스레드 켜기 ##############
serial_c = Thread(target=Camera, args=(serial_port, cap,))
serial_c.daemon = False # 수신을 하는 스레드는 데몬 스레드
serial_c.start()
time.sleep(1)
다음과 같이 tread 두개를 나눠서 하나는 연속적으로 카메라만 띄우고
다른 한개가 제어보드와 송수신을 하는 것을 구상하여서
Camera 함수를 다음과 같이 구상
#-----------------------------------------------
def Camera(ser, cap):
W_View_size = 640
H_View_size = int(W_View_size / 1.333)
FPS = 90 # PI CAMERA: 320 x 240 = MAX 90
try:
cap = cv2.VideoCapture(0) # 카메라 켜기 # 카메라 캡쳐 (사진만 가져옴)
cap.set(3, W_View_size)
cap.set(4, H_View_size)
cap.set(5, FPS)
print("Get ready to camera!")
except:
print('cannot load camera!')
while cv2.waitKey(33) < 0:
_, src = cap.read() #영상파일 읽어드리기
cv.imshow("Original", src) #원본 화면
cap.release()
cv2.destroyAllWindows()
ㅊ하지만 마지막에서 두번째 줄에 imshow를 넣었음에도 불구하고 창이 안뜨는 문제가 발생
(import cv2 as cv를 하여서 코드상의 문제는 아니였습니다)
waitKey() : 키 입력을 기다리는 대기 함수
=> 해결방법
cv2.waitKey(1)을 넣어서 해결
추측컨데 delay가 없어서 계속 cap를 받기만 한거 같다
cv2.waitKey() 함수는 지정된 시간동안 키보드의 입력을 기다리는 함수 이고 (ms)가 기본단위이다
만약 ESC 면 cv2.waitKey() == 27 이다
이를 응용해보면
k = cv2.waitKet(0) & 0xFF
0xFF는 운영체제가 64 비트여서 and연산자를 넣은 것이고
waitKey에 0 이만 무한대기 (키가 입력될때 까지)
그리고 입력받은 값은 k로 저장된다 (아스키 값)
이를 이용하려면
ord() <=> chr()을 이용하면 될 것 같다
※추가정리
cv2.destroyAllWindows() : 프로그램 종료
마지막으로 밤새는 불쌍한 우리 팀원들 첨부 ㅠㅠ

728x90