저번 시간에 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 사용 시 한글 포함 경로를 저장하지 못함, 또한 파일명에 사용할 수 없는 특수기호 포함 시
# 실행에는 문제없지만 파일 저장은 안되기 때문에 주의하기
실행 영상
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
실행해보면 정상적으로 캡쳐가 완료됐다는 출력문과 함께 지정한 경로에 영상의 캡쳐본이 저장된다.
'코딩 수업 기록 > 수화 인식 프로젝트' 카테고리의 다른 글
| [수화 인식 프로젝트] 5주차 수업 _ webcam 영상에서 물체 테두리 따기 (0) | 2021.11.10 |
|---|---|
| [수화 인식 프로젝트] 3,4주차 수업 _ opencv 에서 webcam 캡쳐하여 모서리 인식하기 (0) | 2021.09.26 |
| [수화 인식 프로젝트] 1주차 수업 _ opencv 이용하여 webcam 켜기 (0) | 2021.09.11 |