1장. AI 비전과 OpenCV 개발환경
영상처리와 딥러닝
과일 검사원이 두 명 있다고 해 봅시다. 한 명은 자와 색상표를 들고 "지름 7cm 이상, 빨간색 면적 80% 이상이면 1등급"이라는 규칙대로 잽니다. 다른 한 명은 사과를 수만 개 본 경험으로 "이건 1등급"이라고 바로 압니다. 앞사람이 영상처리, 뒷사람이 딥러닝입니다.
왼쪽은 사람이 계산 규칙을 적는 영상처리, 오른쪽은 정답이 붙은 사진으로 배우는 딥러닝입니다. 여기서 자와 색상표가 OpenCV 의 함수이고, 수만 개를 본 경험이 학습한 모델입니다. 두 검사원은 경쟁 관계가 아니라 한 팀입니다. 앞사람이 사과를 깨끗이 닦아 줄을 세워 주면, 뒷사람이 더 정확하게 판단합니다.
두 방법 견주기
| 견줄 것 | 영상처리 (OpenCV) | 딥러닝 (YOLO 등) |
|---|---|---|
| 규칙은 누가 만드나 | 사람이 계산식과 기준값을 정한다 | 모델이 정답 붙은 사진에서 배운다 |
| 필요한 것 | 문제를 잘 아는 사람 | 정답이 붙은 사진 수백~수천 장 |
| 왜 그렇게 답했나 | 계산식을 보면 안다 | 바로 알기 어렵다 |
| 잘하는 일 | 밝기 조정, 노이즈 제거, 크기 재기 | 모양이 제각각인 물건 알아보기 |
| 이 과정에서 | 2장부터 16장까지 | 17장부터 19장까지 |
import numpy as np
# 영상처리식 판단: 사람이 정한 규칙(빨간 칸이 절반 넘으면 "빨간 사과")
patch = np.array([[[30, 30, 200], [40, 40, 210]],
[[60, 160, 70], [35, 35, 190]]], dtype=np.uint8) # BGR 칸 4개
blue, green, red = patch[..., 0], patch[..., 1], patch[..., 2]
is_red = (red > 150) & (green < 100) # 칸마다 "빨간가?" 를 True/False 로
print(is_red.mean()) # 결과: 0.75 → 네 칸 가운데 세 칸이 빨강
print("빨간 사과" if is_red.mean() > 0.5 else "다른 과일")patch[..., 0] 의 ...(Ellipsis, 생략)은 "앞의 방향은 모두"라는 뜻입니다. 모든 칸에서 0번 채널(파랑)만 꺼냅니다. True 를 1, False 를 0 으로 세므로 mean() 은 True 의 비율이 됩니다.
주의할 점
- 규칙은 조명이 바뀌면 쉽게 깨집니다. 위 예의 "빨강이 150 넘으면"은 어두운 가게에서는 맞지 않을 수 있습니다.
- 그래서 전처리로 조명과 크기를 고르게 맞춰 두면, 규칙도 모델도 더 잘 맞습니다.