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

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

설치 확인과 첫 코드

새 주방에 들어가면 요리하기 전에 수도꼭지를 틀고 가스 불을 켜 봅니다. 물이 나오고 불이 붙는 것을 확인해야 안심하고 요리를 시작합니다. OpenCV 도 설치한 뒤 세 가지를 확인합니다. 불러와지는지, 그림을 읽는지, 화면에 제대로 보이는지입니다.

버전 찍기, 그림 읽기, 화면에 보기의 세 단계를 화살표로 이은 흐름도

그림의 세 단계를 하나씩 통과하면 실습 준비가 끝납니다. 여기서 수도꼭지가 import cv2, 가스 불이 cv2.imread, 냄비에 물이 끓는 것을 보는 일이 Matplotlib 으로 그림을 띄우는 일입니다.

그림을 읽는 함수: cv2.imread

cv2.imread 는 image read(그림 읽기)를 줄인 이름입니다. 파일 이름을 주면 NumPy 배열을 돌려줍니다. 읽지 못하면 오류를 내지 않고 조용히 None 을 돌려줍니다. 그래서 읽은 뒤에는 꼭 None 인지 확인합니다.

Python
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 등)에 두면 이 문제를 피할 수 있습니다. 한글 경로를 꼭 써야 하면 아래처럼 읽고 씁니다.

Python
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(지금 작업 폴더 알려 줘)의 줄임입니다.
← 이전 절1장 · 가상환경 만들고 패키지 설치하기다음 절 →1장 · 실습 지도