1장. AI 비전과 OpenCV 개발환경
설치 확인과 첫 코드
새 주방에 들어가면 요리하기 전에 수도꼭지를 틀고 가스 불을 켜 봅니다. 물이 나오고 불이 붙는 것을 확인해야 안심하고 요리를 시작합니다. OpenCV 도 설치한 뒤 세 가지를 확인합니다. 불러와지는지, 그림을 읽는지, 화면에 제대로 보이는지입니다.
그림의 세 단계를 하나씩 통과하면 실습 준비가 끝납니다. 여기서 수도꼭지가 import cv2, 가스 불이 cv2.imread, 냄비에 물이 끓는 것을 보는 일이 Matplotlib 으로 그림을 띄우는 일입니다.
그림을 읽는 함수: cv2.imread
cv2.imread 는 image read(그림 읽기)를 줄인 이름입니다. 파일 이름을 주면 NumPy 배열을 돌려줍니다. 읽지 못하면 오류를 내지 않고 조용히 None 을 돌려줍니다. 그래서 읽은 뒤에는 꼭 None 인지 확인합니다.
import cv2
# 이 과정의 실습은 data 폴더에서 실행한다. 그 폴더의 과일 진열대 그림을 읽는다
img = cv2.imread("fruit_stand.png")
if img is None:
print("읽기 실패: 파일 이름과 위치를 확인하세요")
else:
print("읽기 성공:", img.shape)
# 없는 파일을 읽으면 오류 대신 None 이 돌아온다
missing = cv2.imread("no_such_file.png")
print(missing is None) # 결과: True한글 경로를 조심하기
Windows 에서 cv2.imread 와 cv2.imwrite 는 경로에 한글이 들어 있으면 실패합니다. 교안을 만든 PC 에서 직접 시험한 결과는 이렇습니다.
| 시험 | 결과 |
|---|---|
작업 폴더 안의 파일을 상대 경로(fruit_stand.png)로 읽기 | 성공 |
같은 파일을 한글이 든 절대 경로(C:\workspace교안\...\fruit_stand.png)로 읽기 | None |
한글이 든 절대 경로로 저장하기(cv2.imwrite) | False |
한글 경로를 np.fromfile 로 읽어 cv2.imdecode 로 풀기 | 성공 |
과목 폴더를 영어 이름의 폴더(C:\workspace\opencv-class 등)에 두면 이 문제를 피할 수 있습니다. 한글 경로를 꼭 써야 하면 아래처럼 읽고 씁니다.
import cv2
import numpy as np
# 파일을 바이트 묶음으로 읽은 뒤(np.fromfile) OpenCV 가 그림으로 푼다(cv2.imdecode)
data = np.fromfile("fruit_stand.png", dtype=np.uint8)
img = cv2.imdecode(data, cv2.IMREAD_COLOR)
print(img.shape)
# 저장은 반대로: 그림을 png 바이트로 바꾼 뒤(cv2.imencode) 파일로 쓴다(tofile)
ok, buf = cv2.imencode(".png", img)
print(ok, len(buf) > 0)imdecode 는 image decode(그림 풀기), imencode 는 image encode(그림 묶기)를 줄인 이름입니다. 파일을 실제로 쓸 때는 buf.tofile("경로") 를 이어 부릅니다.
자주 만나는 첫 오류
| 증상 | 까닭 | 해결 |
|---|---|---|
No module named 'cv2' | 다른 파이썬에 설치했거나 가상환경을 안 켰다 | (.venv) 확인, VS Code 에서 .venv 파이썬 고르기 |
imread 가 None | 파일 이름 오타, 작업 폴더가 다름, 한글 경로 | os.getcwd() 로 작업 폴더 확인, 영어 경로 쓰기 |
'NoneType' object has no attribute 'shape' | None 을 확인하지 않고 썼다 | 읽은 뒤 if img is None: 으로 막기 |
| 사과가 파랗게 보인다 | BGR 그림을 RGB 로 보여 줬다 | cv2.cvtColor(img, cv2.COLOR_BGR2RGB) |
주의할 점
cv2.imread는 파일이 없을 때 터미널에[ WARN:0@...] ... can't open/read file같은 경고 글을 찍기도 합니다. 프로그램이 멈춘 것은 아니고, 돌려받은 값이None입니다.- 작업 폴더는 실행하는 곳에 따라 바뀝니다. 파일을 못 찾으면
import os; print(os.getcwd())로 지금 폴더부터 봅니다. getcwd 는 get current working directory(지금 작업 폴더 알려 줘)의 줄임입니다.