1장. AI 비전과 OpenCV 개발환경
실습 2 — 숫자로 첫 그림 만들기
카메라 없이 숫자만으로 그림을 만들어 저장합니다. 그림이 숫자 표라는 것과, OpenCV 가 색을 BGR 순서로 적는다는 것을 직접 확인합니다.
1단계. 빈 도화지 만들기
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단계. 세 칸으로 나눠 색칠하기
# 가로를 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단계. 파일로 저장하기
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단계. 다시 읽어 같은지 보기
# 저장한 파일을 다시 읽는다. 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장).