OpenCV 비전 실무1장 · AI 비전과 OpenCV 개발환경16 / 22← 이전목차다음 →MetaContents

1장. AI 비전과 OpenCV 개발환경

실습 2 — 숫자로 첫 그림 만들기

카메라 없이 숫자만으로 그림을 만들어 저장합니다. 그림이 숫자 표라는 것과, OpenCV 가 색을 BGR 순서로 적는다는 것을 직접 확인합니다.

1단계. 빈 도화지 만들기

Python
import numpy as np

# 세로 120칸, 가로 180칸, 칸마다 숫자 3개(B, G, R)인 검은 도화지
# np.zeros: 모든 값이 0 인 배열. dtype=np.uint8: 0~255 의 정수만 담는다
img = np.zeros((120, 180, 3), dtype=np.uint8)

print("모양:", img.shape)                 # 결과: (세로, 가로, 채널)
print("숫자 개수:", img.size)             # 결과: 120 × 180 × 3
print("왼쪽 위 칸:", img[0, 0])           # 결과: [0 0 0] → 검정
출력
모양: (120, 180, 3)
숫자 개수: 64800
왼쪽 위 칸: [0 0 0]

2단계. 세 칸으로 나눠 색칠하기

Python
# 가로를 60칸씩 셋으로 나눠 칠한다. 색은 (파랑, 초록, 빨강) 순서다
img[:, 0:60] = (255, 0, 0)       # 왼쪽: 파랑만 가득
img[:, 60:120] = (0, 255, 0)     # 가운데: 초록만 가득
img[:, 120:180] = (0, 0, 255)    # 오른쪽: 빨강만 가득

# 가운데 줄(60번 줄)에서 세 구역의 칸 하나씩을 찍어 본다
for x in (30, 90, 150):
    print(f"x={x:3} 칸의 BGR:", img[60, x])
출력
x= 30 칸의 BGR: [255   0   0]
x= 90 칸의 BGR: [  0 255   0]
x=150 칸의 BGR: [  0   0 255]

3단계. 파일로 저장하기

Python
import os
import cv2

# cv2.imwrite(파일 이름, 배열): image write. 확장자(.png)를 보고 형식을 정해 저장한다
# 성공하면 True, 실패하면 False 를 돌려준다
ok = cv2.imwrite("out_ch01_first.png", img)
print("저장 성공:", ok)
print("파일 크기:", os.path.getsize("out_ch01_first.png"), "바이트")
출력
저장 성공: True
파일 크기: 813 바이트

4단계. 다시 읽어 같은지 보기

Python
# 저장한 파일을 다시 읽는다. png 는 숫자를 그대로 보존하는 형식이다
back = cv2.imread("out_ch01_first.png")

print("다시 읽은 모양:", back.shape)
# np.array_equal: 두 배열의 모양과 모든 숫자가 같으면 True
print("숫자가 모두 같은가:", np.array_equal(img, back))
출력
다시 읽은 모양: (120, 180, 3)
숫자가 모두 같은가: True

코드 설명

  • np.zeros((120, 180, 3), dtype=np.uint8) 는 (세로, 가로, 채널) 모양의 검은 그림입니다. img.size 는 숫자의 총 개수로, 120×180×3 = 64,800 입니다.
  • img[:, 0:60] = (255, 0, 0) 은 "모든 줄의 0~59번 칸"에 파랑을 칠합니다. OpenCV 는 BGR 순서이므로 첫 숫자가 파랑입니다.
  • cv2.imwrite 는 저장에 성공하면 True 를 돌려줍니다. 한 가지 색으로 넓게 칠한 그림은 png 가 짧게 줄여 저장하므로 파일이 아주 작습니다.
  • np.array_equal(img, back) 이 True 라는 것은 png 가 숫자를 하나도 바꾸지 않고 저장했다는 뜻입니다. jpg 는 파일을 줄이려고 숫자를 조금 바꿉니다(2장).
← 이전 절1장 · 실습 1 — 개발환경 점검하기다음 절 →1장 · 실습 3 — 그림 파일 읽고 정보 보기