OpenCV 비전 실무20장 · 교육 콘텐츠 설계와 종합 실습8 / 21← 이전목차다음 →MetaContents

20장. 교육 콘텐츠 설계와 종합 실습

단계별 실습 짜기와 흔한 오류

가구를 조립할 때 설명서는 "1단계: 다리 네 개를 상판에 끼운다. 이렇게 보이면 됩니다(그림)"처럼 단계마다 확인 그림을 둡니다. 3단계에서 나사가 남으면 2단계 그림과 견줘 어디서 틀렸는지 바로 압니다. 이 교안의 실습을 #### 1단계. 부터 4단계까지로 나누고 단계마다 출력을 둔 것도 같은 까닭입니다.

읽기, 처리, 확인, 저장·보기의 네 단계를 이은 흐름도

그림의 네 단계가 실습 하나의 기본 뼈대입니다. 여기서 설명서의 단계가 #### N단계. 이고, "이렇게 보이면 됩니다" 그림이 단계마다의 확인 출력(text 블록)입니다. 이렇게 어려운 과제를 작은 단계로 받쳐 주는 방법을 비계라고 부릅니다. 수강생이 익숙해지면 단계를 하나씩 합쳐 발판을 걷어 냅니다.

수강생이 자주 막히는 곳

수업 전에 "어디서 막힐까"를 미리 적어 두면, 질문이 몰릴 때 표를 띄워 한 번에 안내할 수 있습니다. 아래는 이 교안의 앞 장에서 다룬 흔한 오류입니다.

증상까닭고치는 법다룬 곳
'NoneType' object has no attribute 'shape'cv2.imread 가 실패해 None 을 돌려줌읽은 직후 if img is None 으로 확인1장, 2장
사과가 파랗게 보인다BGR 그림을 그대로 plt.imshow 에 넣음cv2.COLOR_BGR2RGB 로 바꿔 넣기1장, 3장
파일이 분명히 있는데 NoneWindows 에서 경로에 한글이 있음작업 폴더를 옮겨 상대 경로 쓰기, np.fromfile + cv2.imdecode1장
가장 밝던 칸이 검게 바뀐다uint8 넘침(250 + 60 → 54)cv2.add, np.clip 으로 포화 연산1장, 5장
흑백 그림이 보라·노랑으로 보인다cmap="gray" 를 빠뜨림plt.imshow(gray, cmap="gray")1장
No module named 'cv2'패키지를 깐 가상환경과 실행한 파이썬이 다름VS Code 에서 .venv 고르기1장
창이 뜨지 않고 멈춘다cv2.imshow 뒤 waitKey 를 기다림Matplotlib 으로 띄우기1장, 15장

짧은 예시

단계마다 "통과/막힘"과 고칠 곳을 찍는 작은 확인 함수를 만들어 둡니다. 수강생은 "막힘"이 처음 나온 줄만 보면 됩니다.

Python
import cv2
import numpy as np

def check(step, ok, hint):
    """확인 결과를 한 줄로 찍는다. 막히면 고칠 곳을 함께 알려 준다."""
    print(f"[{'통과' if ok else '막힘'}] {step}" + ("" if ok else f" → {hint}"))
    return ok

img = cv2.imread("fruit_stand.png")
check("1단계 읽기", img is not None, "작업 폴더가 data 인지, 파일 이름이 맞는지 보세요")
check("1단계 컬러인가", img is not None and img.ndim == 3, "IMREAD_GRAYSCALE 로 읽지 않았는지 보세요")
check("1단계 자료형", img is not None and img.dtype == np.uint8, "uint8 이어야 합니다")

wrong = cv2.imread("fruit_stnad.png")    # 일부러 이름을 틀려 본다
check("오타 난 파일 읽기", wrong is not None, "이름을 확인하세요")

주의할 점

  • 확인 출력은 짧게 둡니다. 배열 전체를 찍으면 화면이 숫자로 가득 차서 중요한 줄을 놓칩니다. shape, dtype, 최솟값·최댓값 정도면 됩니다.
  • 없는 파일을 읽을 때 OpenCV 가 [ WARN:0@...] 같은 글을 따로 찍을 수 있습니다. 오류가 아니라 알림이라고 미리 알려 줍니다.
← 이전 절20장 · 정답표와 자동 채점다음 절 →20장 · 시각 자료 만들기