이전 글
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 출력
7. 파일저장
이미지 저장
이전에 처리했던 이미지를 cv2.imwrite 를 이용하여 워크스페이스에 저장할 수 있다.
cv2.imwrite("file_name", image)
예를 들어 흑백으로 불러온 "img.jpg" 이미지 파일을 img_save.jpg로 저장하면 다음과 같이 나타낼 수 있다
import cv2
img = cv2.imread("img.jpg", cv2.IMREAD_GRAYSACLE)
# 아레 과정은 생략할 수 있다
# --- ---
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# --- ---
result = cv2.imwirte("img_save.jpg", img)
print()
True
먼저 imshow()를 통해 흑백처리된 이미지가 출력된다. 이미지를 닫으면 result에 대한 결과가 출력된다. workspace를 확인하면 img_save.jpg 파일이 잘 저장됨을 확인할 수 있다.
다른 포맷으로 저장할 경우 저장하는 파일 이름을 정할 때 파일 확장자 명과 함께 작성하면 된다.
예를 들어 위의 jpg파일을 png로 저장하는 경우 cv2.imwrite("img_save.png", img)라고 바꿔주면 된다.
import cv2
img = cv2.imread("img.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imwrite("img_save.png", img)
True
동영상 저장
이전에 동영상을 재생하기 위해 반복문을 통해 프레임을 출력해냈었다. 동영상을 저장할 때도 이 반복문 안에서 해결할 수 있다. 다만 이미지를 저장할 때처럼 단순히 확장자 명을 입력해서 파일저장 옵션을 선택하는 것이 아니라 코덱을 정의하고 영상의 크기와 속도를 설정하여 저장한다.
cv2.VideoWriter("file_name", fourcc, fps, (width, height), isColor = None)
1. 코덱 정의
먼저 사용할 코덱을 정의한다. 이때 코덱은 아래와 같이 fourcc, 즉 four-character code 4문자로 나타낸다.
- * 'DIVX' : DIVX MPEG-4 코덱
- * 'XVID' : XVID MPEG-4 코덱
- * 'FMP4' : FFMPEG MPEG-4 코덱
- * 'X264' : H.264/AVC 코덱
- * 'MJPG' : Motion-JPEG 코덱
fourcc = cv2.VideoWriter_fourcc(*'codec')
참고로 텍스트 앞에 *이 붙으면 문자 하나하나가 출력됨을 의미한다.
# ex
codec = 'DIVX'
print([codec])
print([*codec])
['DIVX']
['D', 'I', 'V', 'X']
2. 영상 크기 및 속도 정의
영상의 크기와 속도를 정의할 때 원본 영상의 크기와 속도를 가져올 때 다음을 사용한다.
# 원본 영상 가로길이
cv2.CAP_PROP_FRAME_WITDTH
# 원본 영상 세로길이
cv2.CAP_PROP_FRAME_HEIGHT
# 원본 영상 프레임 속도
cv2.CAP_PROP_FPS
3. 영상 데이터 저장
위에서 코덱과 영상크기, 속도를 cv2.VideoWriter()을 이용해 정의하면 캡쳐한 프레임 데이터를 저장한다. 이때 음성정보는 저장되지 않기 때문에 영상의 소리는 저장되지 않는다.
out = VideoWriter('file_name', fourcc, fps, (width, height))
out.write(frame)
4. 자원 해제
반복문이 모두 실행되고 나면 release 함수로 자원 해제한다.
out.release()
위의 과정을 바탕으로 이 전에 출력했던 'video.mp4'파일을 재생하면서 'output.avi' 파일로 원본 영상의 크기와 속도와 같이 저장하면 다음과 같다.
import cv2
cap = cv2.VideoCapture('video.mp4')
# 1. 코덱정의
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
# 2. 영상 크기 및 속도정의
width = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 3. 영상 데이터 저장
out.write(frame)
cv2.imshow('video', frame)
if cv2.waitKey(1) == ord('q'):
break
# 4. 자원 해제
out.release()
cap.release()
cv2.destroyAllWindows()
위의 파일에서 초당 프레임(fps) 값을 조정할 수 있다. 만약 원본 영상의 절반의 속도로 재생한다면 fps를 다음과 같이 나타내면 된다.
fps = cap.get(cv2.CAP_PROP_FPS) / 2
# 원본 FPS / 2 인 경우
import cv2
cap = cv2.VideoCapture('video.mp4')
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
width = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 원본 초당 프레임의 절반으로 설정한다.
fps = cap.get(cv2.CAP_PROP_FPS) / 2
# 저장되는 파일 이름을 output_slow로 변경
out = cv2.VideoWriter('output_slow.avi', fourcc, fps, (width, height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
out.write(frame)
cv2.imshow('video', frame)
if cv2.waitKey(1) == ord('q'):
break
out.release()
cap.release()
cv2.destroyAllWindows()
이처럼 초당 프레임 값이 절반이 되면서 원본 영상(output.avi)비디오 길이보다 2배 늘어나 11초에서 22초가 되었음을 확인할 수 있다.
'Study > ML | DL' 카테고리의 다른 글
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 처리 (0) | 2023.05.19 |
---|---|
[Python] OpenCV를 이용한 이미지/영상 처리 - 크기 조정 (0) | 2023.05.18 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 텍스트 (0) | 2023.05.12 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 도형그리기2(원형, 사각형, 다각형) (0) | 2023.05.04 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 도형그리기1(영역색칠, 직선) (0) | 2023.05.03 |