OpenCV 비전 실무2장 · 이미지 입출력과 영상 시각화7 / 21← 이전목차다음 →MetaContents

2장. 이미지 입출력과 영상 시각화

저장하기와 저장 옵션

사진관에 인화를 맡길 때 "광택지로, 이 크기로" 하고 주문서에 적습니다. 주문서가 없으면 사진관이 정한 기본값으로 뽑습니다. cv2.imwrite 도 같습니다. 파일 이름의 확장자가 형식을 정하고, 셋째 자리에 주문서(옵션)를 붙이면 품질이나 압축 정도를 정할 수 있습니다.

배열 준비, 확장자 보기, 옵션 적용, 결과 확인의 네 단계를 이은 흐름도

그림의 네 단계를 왼쪽부터 읽습니다. OpenCV 는 먼저 확장자를 보고 형식을 고르고, 옵션이 있으면 반영해 저장한 뒤 성공 여부를 True 나 False 로 돌려줍니다. 여기서 인화 주문서가 옵션 목록이고, 사진관의 기본값이 옵션을 주지 않았을 때의 값입니다.

자주 쓰는 저장 옵션

옵션원래 말값의 범위기본값뜻
cv2.IMWRITE_JPEG_QUALITYimage write JPEG quality0~10095클수록 화질이 좋고 파일이 크다
cv2.IMWRITE_PNG_COMPRESSIONimage write PNG compression0~91클수록 파일이 작고 저장이 느리다. 화질은 늘 같다

옵션은 [옵션 이름, 값] 꼴의 목록으로 줍니다. 여러 개를 주려면 [이름1, 값1, 이름2, 값2] 처럼 이어 적습니다.

Python
import os
import cv2

img = cv2.imread("ch02_product.png")
# JPG 품질 80 으로 저장. 돌려받은 값이 True 면 성공
ok = cv2.imwrite("out_ch02_demo.jpg", img, [cv2.IMWRITE_JPEG_QUALITY, 80])
print("저장:", ok, os.path.getsize("out_ch02_demo.jpg"), "바이트")

# PNG 압축 0(압축 안 함)과 9(가장 세게)의 크기를 메모리 안에서 견준다
for level in (0, 9):
    ok, buf = cv2.imencode(".png", img, [cv2.IMWRITE_PNG_COMPRESSION, level])
    print(f"PNG 압축 {level}: {len(buf):,}바이트")

# 없는 폴더에 저장하면 오류 없이 False 를 돌려준다
print("없는 폴더:", cv2.imwrite("no_folder/x.png", img))   # 결과: False

저장이 실패하는 경우

상황결과해결
저장할 폴더가 없다Falseos.makedirs(폴더, exist_ok=True) 로 먼저 만든다
한글이 든 절대 경로(Windows)False상대 경로를 쓰거나 imencode + tofile
모르는 확장자(.abc)cv2.error 오류로 멈춘다.png, .jpg 처럼 아는 확장자를 쓴다
투명 그림(BGRA)을 .jpg 로True 지만 알파가 사라진다투명도를 지키려면 .png

주의할 점

  • cv2.imwrite 는 실패해도 멈추지 않고 False 만 돌려줍니다. 결과를 꼭 받아서 확인합니다.
  • PNG 압축 숫자는 화질과 관계가 없습니다. 0 이든 9 든 다시 읽은 숫자는 원본과 똑같고, 크기와 저장 시간만 달라집니다.
← 이전 절2장 · 좌표 두 가지와 잘라 내기다음 절 →2장 · 화면에 띄우는 두 길