OpenCV 비전 실무19장 · Vision 데이터 파이프라인5 / 21← 이전목차다음 →MetaContents

19장. Vision 데이터 파이프라인

수집 단계

도서관에 새 책 상자가 들어오면 사서는 먼저 상자를 열어 책만 꺼내고, 안에 든 거래 명세서나 광고지는 따로 둡니다. 그리고 책마다 "어느 출판사에서, 몇 번째 상자로 왔는지"를 대장에 적습니다. 수집 단계도 폴더에서 그림만 고르고, 그림마다 출처를 적습니다.

폴더 훑기, 그림 고르기, 프레임 뽑기, 출처 적기의 네 걸음을 이은 흐름도

그림의 네 걸음이 수집 단계의 순서입니다. 17장처럼 폴더를 이름순으로 훑고, 확장자로 그림만 고릅니다. 동영상은 15장처럼 N장마다 한 장을 뽑습니다. 마지막으로 그림마다 파일 이름이나 "동영상 이름#프레임 번호"를 출처로 적습니다. 여기서 책 상자가 입고 폴더, 거래 명세서가 정답표(answer.csv) 같은 그림 아닌 파일, 대장에 적는 일이 출처 적기입니다.

이 장의 입고 폴더

파일개수수집에서
belt_001.png ~ belt_024.png 의 png 와 jpg24그림으로 모은다(열리는지는 거르기에서 본다)
answer.csv1확장자가 그림이 아니라 뺀다. 프로젝트의 채점에 쓴다
issues.csv1확장자가 그림이 아니라 뺀다. 섞어 둔 문제의 정답
ch19_belt.mp4 (폴더 밖)48프레임4장마다 하나씩, 12장을 모은다

짧은 예시

Python
from pathlib import Path
import cv2

# 폴더: 확장자가 그림인 파일만 이름순으로 모은다(17차시)
EXTS = [".png", ".jpg", ".jpeg"]
items = [{"file": p.name, "source": p.as_posix()}
         for p in sorted(Path("ch19_incoming").iterdir()) if p.suffix.lower() in EXTS]
print("그림:", len(items), "장, 첫 항목:", items[0])

# 동영상: 4장마다 하나씩 뽑고 출처를 "이름#번호" 로 적는다(15차시)
cap = cv2.VideoCapture("ch19_belt.mp4")
frames, no = [], 0
while True:
    ok, frame = cap.read()
    if not ok:
        break
    if no % 4 == 0:
        frames.append({"file": f"frame_{no:03d}", "source": f"ch19_belt.mp4#{no}", "img": frame})
    no += 1
cap.release()
print("프레임:", no, "장 가운데", len(frames), "장, 출처 예:", frames[1]["source"])
# 결과: 그림: 24 장, 첫 항목: {'file': 'belt_001.png', 'source': 'ch19_incoming/belt_001.png'}
#       프레임: 48 장 가운데 12 장, 출처 예: ch19_belt.mp4#4

p.as_posix() 는 경로를 / 로 이은 글자로 바꿉니다(17장). 동영상 프레임은 파일이 없으므로 수집 단계에서 바로 그림 배열(img)을 담고, 폴더의 그림은 거르기 단계에서 읽습니다.

주의할 점

  • 확장자는 소문자로 바꿔 견줍니다. .PNG, .JPG 처럼 대문자로 저장된 파일을 놓치지 않습니다(17장).
  • 출처를 적지 않으면 보고서에서 "이상한 상자가 나온 그림"을 다시 찾기 어렵습니다. 동영상은 프레임 번호까지 적어야 그 장면으로 돌아갈 수 있습니다.
← 이전 절19장 · 단계를 함수로 나누기다음 절 →19장 · 거르기 단계