코딩 수업 기록/수화 인식 프로젝트

[수화 인식 프로젝트] 2주차 수업 _ opencv 에서 webcam 캡쳐하여 파일 저장하기_분명 오류는 안나는데 저장이 안될 때

백복치 2021. 9. 15. 22:43

저번 시간에 opencv를 이용해서 웹캠을 실행시키는 코드를 작성하였다.

 

이제 그 웹캠을 실행해서 영상 속에서 캡쳐한 후 파일로 저장해보는 과정을 진행했다.

 

별로 어려운 건 아니었는데 window 유저로서 뭐가 잘못된 건지 몰랐던 것도 있고,

 

아주 기본적인 부분에서 실수한 것이 있어서 2시간이나 소요했다는 ^^..

 


 

저번 기본 코드에서 몇 가지를 추가해주도록 하겠다.

 

        now = datetime.datetime.now().strftime("%m-%d (%H;%M)")

파일 명에 캡쳐된 날짜와 시간을 추가해주어서 헷깔리지 않도록 하기위해

 

now라는 변수에 현재의 시간을 넣어준다.

 

datetime을 사용하려면 import datetime도 해줘야하는 것을 잊지말자.

 

자.. 여기서 나는 헷깔림을 방지하고 싶었다.

 

그래서 초기의 내 코드는

 

now = datetime.datetime.now().strftime("%m월 %d일 (%H:%M)") 이었다.

 

여기서 우리가 체크해야 할 것은 두개다.

 

1. 한글

2. 특수문자

 

내 초기 코드로 실행을 시키면 한글 오류가 뜨게 된다.

 

window는 이렇게 바로 한글을 파일 경로로 넣을 수 없기 때문에

 

후에 사용할 imwrite 부분에서 오류가 생기게 된다.

 

imread를 사용하여 영상이나 사진을 가져와서 imwrite에서 파일 경로를 지정할 때의

 

한글 파일 경로 지정 예제는 몇 가지 보았는데,

 

아무리 찾아도 ㅁㅏㅇㅎㅏㄹ 웹캠 캡쳐일 경우를 찾지 못했다..

 

다양한 맨땅 해딩 시도를 도전하였는데 자꾸 에러가 나서 보류하기로 했다 ^_^

 

그래서 일단 한글을 빼고 다시 실행해보았다.

 

그 떄의 내 코드는

 

now = datetime.datetime.now().strftime("%m-%d (%H:%M)") 이었다.

 

이 때부터는 오류도 안나고 웹캠에서 영상도 잘 켜져서 오 성공인가 했는데

 

지정한 경로에 캡쳐본이 저장이 안된다.

 

2차 화남 + 오류 코드가 없어서 뭐 때문인지 모르겠음.

 

또 이상태로 몇 시간 하다가 깨달았다.

 

대학교 1학년때 전공 책에서 파일명에 사용할 수 있는 것과 없는 것이 중요하다고 교수님께서 그러셨는데

 

파일명에 사용할 수 없는 것이 시험문제에 나와서 달달 외우던 나의 모습과

 

지금 내가 파일에 입력하려는 것에 : 이 포함되어 있었다는 것을 ..

 

 

그렇다. 쓸 수 없다 ^^.

 

그래서 ;로 바꿔버렸다, 허무해서 웃음도 안나옴 대체 난 몇 시간을 버린 것인가..

 

"오늘의 교훈 : 교수님 수업에 집중하자"

 

아무튼 이제 또 다른 key 변수를 선언해주자.

 

이 변수는 우리가 키보드를 눌렀을 때 웹 캠을 끄거나 캡쳐를 하기 위해 사용할 것이다.

 

key = cv2.waitKey(30) & 0xff

if key == 27:  # esc 아스키 코드 번호 27
	break
elif key == 32:  # space 아스키 코드 번호 32
	print("캡쳐완료" + ' ' + now)
	cv2.imwrite("D:/captureimage/" + str(now) + ".png", frame)

 

waitKey(30)는 30밀리초 동안 키 이벤트를 기다리겠다는 의미이다.

 

그리고 16진수 표현을 해주기 위해서 & 0xff 를 해준다.

 

if문과 elif 문에서 key의 값을 16진수 아스키코드로 해주도록 하자.

 

아스키코드 27번은 키보드에서 esc를 클릭하는 것과 같고,

 

32번은 space 키를 클릭하는 것과 같다.

 

 

아스키 코드

 

space바를 클릭하게 되면 캡쳐가 되도록 하였기 때문에 

 

클릭 후 캡쳐본이 어디에 저장될 수 있는지 imwrite로 지정해주자.

 

cv2.imwrite("저장경로" + 현재시간 + ".png", frame)

 

의 형태로 저장하고 싶어서 해주었다.

 

이렇게 저장경로와 저장할 리턴값을 지정해주고 나면 웹캠을 실행해보자.

 

실행하면 원하는 경로에 저장이 되었을 것이다.

 

나중에 체력 충전하고 한글명으로 저장하는 시도 다시 한 번 해봐야겠다.

 


전체코드

# python -m pip install opencv-python 필요
import cv2
import time
import datetime

video = cv2.VideoCapture(0)  # WebCam의 경우 0 또는 1
# 비디오 파일의 경우 '경로/파일명.확장자'

prev_time = 0  # 이전 프레임 재생 시간 값 0으로 초기화
FPS = 100


while True:

    ret, frame = video.read()  # ret = frame 읽기가 성공하면 while문의 true 값 반환, frame = 배열 형식의 영상 프레임 값을 반환
    frame = cv2.flip(frame, 1)
    current_time = time.time() - prev_time  # 현재 시간 - 이전 프레임 재생 시간

    # ret이 true의 값을 가진다면 영상을 재생
    if (ret is True) and (current_time > 1. / FPS):  # 비교
        prev_time = time.time()
        cv2.imshow("VideoCapture", frame)  # imshow(윈도우 창의 이름, cv2.VideoCapture()의 리턴값)

        now = datetime.datetime.now().strftime("%m-%d (%H;%M)")

        key = cv2.waitKey(30) & 0xff

        if key == 27:  # esc 아스키 코드 번호 27
            break
        elif key == 32:  # space 아스키 코드 번호 32
                print("캡쳐완료" + ' ' + now)
                cv2.imwrite("D:/captureimage/" + str(now) + ".png", frame)
                # window에서 imwrite 사용 시 한글 포함 경로를 저장하지 못함, 또한 파일명에 사용할 수 없는 특수기호 포함 시
                # 실행에는 문제없지만 파일 저장은 안되기 때문에 주의하기

 

실행 영상

 

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 

실행해보면 정상적으로 캡쳐가 완료됐다는 출력문과 함께 지정한 경로에 영상의 캡쳐본이 저장된다.