파이썬 AI 학교 챌린지 #88: 족집게 레이더! ‘이미지 외곽선(Contour) 발견하고 조준하기’

안녕하세요! 가족과 함께하는 스마트 라이프입니다. 어제 캐니 알고리즘으로 사진을 멋진 스케치화로 바꾸는 마법을 부려봤죠? 오늘은 컴퓨터의 눈을 더 똑똑하게 만들어서, 찾아낸 선들을 하나의 덩어리로 묶어 “여기에 물체가 있구나!” 하고 정확하게 알아채는 ‘외곽선 추적(Contour)’ 마법을 배워볼 거예요. 물체를 찾아내어 네모 박스로 조준하는 레이더 같은 기술을 함께 만들어봐요!

파이썬 AI 학교 챌린지 #88: 족집게 레이더! ‘이미지 외곽선(Contour) 발견하고 조준하기’

1. 윤곽선(Edge)과 외곽선(Contour)은 어떻게 다를까요?

어제 배운 윤곽선(Edge)은 색이 바뀌는 모든 점을 선으로 딴 것이라 조금 지저분할 수 있어요. 반면 오늘 배운 외곽선(Contour)은 ‘같은 색이나 밝기를 가진 경계선을 연결한 하나의 연속된 폐쇄 곡선’을 말해요. 쉽게 말해, 윤곽선이 스케치라면 외곽선은 물체의 겉 테두리를 따라 가위질을 할 수 있는 ‘진짜 완벽한 형태의 선’이랍니다.

2. 족집게 레이더의 필수 주문

물체의 형태를 감지하고 조준하기 위해 필요한 주문들을 배워봐요.

  • cv2.findContours(): 이미지 안에서 연결된 외곽선들을 샅샅이 찾아내어 리스트로 모아주는 핵심 주문이에요.
  • cv2.drawContours(): 컴퓨터가 찾아낸 외곽선 줄기를 도화지 위에 원하는 색깔로 예쁘게 그려줘요.
  • cv2.boundingRect(): 찾아낸 외곽선을 딱 맞게 감싸는 가장 작은 ‘가로세로 직사각형 상자’의 좌표를 계산해 줘요.

3. 실전 연습: 사진 속 물체 찾아내고 상자 치기 코딩

import cv2

print("🚀 파이썬 레이더 비서가 물체 탐색을 시작합니다!")

# 1. 이미지 불러오기 (우리의 단골 주인공 강아지 사진!)
image = cv2.imread("dog.jpg")

if image is None:
    print("❌ 'dog.jpg' 파일이 없어요! 파일 위치를 다시 확인해 주세요.")
else:
    # 복사본 만들기 (나중에 상자를 그릴 도화지에요)
    result_image = image.copy()
    
    # 2. 전처리 단계: 흑백으로 바꾸고 컴퓨터가 보기 좋게 이진화(흑/백)하기
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    # threshold 주문은 밝기 기준(127)보다 밝으면 흰색, 어두우면 검은색으로 딱 나눠줘요
    _, thresh = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY_INV)
    
    # 3. [핵심 마법] 외곽선 찾아내기
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    print(f"🎯 폴더 안에서 총 {len(contours)}개의 물체 후보를 발견했습니다!")
    
    # 4. 찾아낸 물체들 위에 초록색 조준 상자 그리기
    for cnt in contours:
        # 너무 작은 먼지 같은 외곽선은 무시하기 (넓이가 500픽셀 이상인 것만!)
        if cv2.contourArea(cnt) > 500:
            # 외곽선을 감싸는 사각형 좌표 구하기 (x, y 좌표와 가로, 세로 크기)
            x, y, w, h = cv2.boundingRect(cnt)
            
            # 원래 사진 위에 초록색(0, 255, 0)으로 두께 3짜리 사각형 그리기
            cv2.rectangle(result_image, (x, y), (x + w, y + h), (0, 255, 0), 3)
            
    # 5. 화면에 레이더 가동 결과 띄우기
    cv2.imshow("Thresh Image (Computer Vision)", thresh)
    cv2.imshow("Radar Detection Result", result_image)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    print("\n✨ 물체 감지 레이더가 안전하게 종료되었습니다!")
파이썬 AI 학교 챌린지 #88: 족집게 레이더! ‘이미지 외곽선(Contour) 발견하고 조준하기’

4. 더 예리한 자율주행 탐사선으로 업그레이드!

우리 레이더 비서의 센서를 더 똑똑하게 튜닝해볼까요?

  • 물체 개수 세기: if cv2.contourArea(cnt) > 500: 내부에 카운터 변수를 두어, 사각형이 그려질 때마다 숫자를 세어 화면에 “총 N개의 물체가 있습니다!”라고 출력해 보세요.
  • 글씨로 태그 달기: 69탄 게임 학교에서 배운 글자 출력 원리처럼 cv2.putText() 주문을 써서, 사각형 상자 바로 위에 ‘Object’라는 글씨를 멋지게 새겨보세요.
  • 특정 모양만 고르기: 가로와 세로 비율을 계산해서 w == h에 가까우면 ‘동그라미나 정사각형’, 한쪽이 길면 ‘직사각형’으로 형태를 구별하는 지능을 더해 보세요.

5. 가족과 함께하는 ‘우리 집 물체 스캔 놀이’

아이와 함께 하얀 종이 위에 가위나 연필, 바나나 같은 물건을 올려두고 사진을 찍어 코드를 실행해 보세요. “컴퓨터가 가위 모양을 사각형으로 딱 알맞게 묶었네!”라며 신기해하는 경험을 나누는 거죠. 아이가 직접 cv2.contourArea()의 문턱값인 500을 100이나 5000으로 고쳐보며 ‘노이즈(먼지)를 걸러내고 진짜 가치 있는 데이터(물체)만 추출하는 기준’을 세우는 법을 배우게 해주세요. EduPad 프로젝트에서 아이들이 수학 서술형 답안지에 손으로 동그라미 표를 하거나 별표를 쳤을 때, 그 기호의 외곽선 주소를 콕 집어내어 해당 문항만 잘라내는 ‘기호 인식 가이드 시스템’의 가장 중추적인 공간 인지 알고리즘으로 활용하기에 정말 완벽한 예제입니다.

마치며: 형체를 알아보기 시작한 파이썬!

챌린지의 88번째 미션 완료! 오늘은 흩어진 점과 선들을 이어 하나의 완전한 사물로 인지하고 구역을 지정하는 대단한 비전 마법을 성공시켰습니다. 이제 여러분의 파이썬은 사물의 위치를 정확히 압니다! 내일 오전 9시에는 이 기술을 극대화해서, 사진 속 수많은 색깔 중 내가 원하는 색만 귀신같이 찾아내 추적하는 ‘색종이 탐지기! 특정 색상 영역 추출(Color Masking)하기’ 이야기로 돌아오겠습니다!