Files
guitar_score/.agent/references/architecture.md
CD 3d3f74b082 feat(pipeline): YouTube Tab → PDF 자동 추출 파이프라인 초기 구현
- 5단계 파이프라인: 다운로드 → 프레임 추출 → 패턴 감지 → 중복 제거 → PDF 생성
- 3가지 패턴 지원: overlay, split, scroll
- MSE 기반 픽셀 비교 프레임 중복 제거
- split 모드: 42% 크롭 + 밝기 필터 + Tab 라인 검증
- overlay 모드: 320x120 정규화 + 슬라이딩 윈도우 비교
- 프로젝트 문서 초기 작성 (architecture, tech-stack, STATUS, known-issues)
2026-03-24 23:29:25 +09:00

2.4 KiB

Architecture

YouTube 기타 TAB 영상 → PDF 자동 추출 파이프라인

프로젝트 개요

YouTube 기타 TAB 튜토리얼 영상을 입력받아, 컴퓨터 비전으로 TAB 악보 영역만 추출하고 중복을 제거하여 깨끗한 PDF/PNG로 출력하는 CLI 도구.

디렉토리 구조

project-root/
├── youtube_tab_to_pdf.py  # 메인 파이프라인 (단일 파일)
├── .env                   # yt-dlp 쿠키 경로 설정
├── .gitignore
├── output/                # 생성된 PDF/PNG/디버그 프레임
├── .agent/                # AI 에이전트 설정
│   ├── AGENT.md
│   ├── references/        # 프로젝트 문서
│   └── workflows/         # 워크플로우 정의
└── docs/devlog/           # 개발 로그

핵심 모듈 (youtube_tab_to_pdf.py 내부)

모듈 역할 비고
download_video() yt-dlp로 영상 다운로드 .env의 쿠키 경로 사용
extract_frames() 영상 → 프레임 분리 (fps=2) OpenCV VideoCapture
detect_pattern() 영상 패턴 분류 (overlay→split→scroll) 우선순위: overlay > split > scroll
_detect_tab_overlay() 흰 박스 + Tab 라인 검출 HoughLinesP 기반
_detect_split_screen() 상단 Tab + 하단 핸드캠 분할 검출 밝기 기준 (top>180, bottom<100)
_has_tab_lines() 수평 Staff 라인 존재 여부 모폴로지 + HoughLinesP
compare_frames() MSE 기반 프레임 유사도 비교 320px 리사이즈, factor 8
extract_unique_*() 패턴별 고유 프레임 추출 scroll/overlay/split 3종
generate_pdf() 프레임 → A4 PDF + 롱 이미지 생성 ReportLab + Pillow

데이터 흐름

graph LR
    A[YouTube URL] --> B[yt-dlp 다운로드]
    B --> C[프레임 추출<br>fps=2]
    C --> D{패턴 감지}
    D -->|overlay| E1[Tab 오버레이 크롭<br>+ 정규화 비교]
    D -->|split| E2[상단 42% 크롭<br>+ 밝기/라인 필터]
    D -->|scroll| E3[상단 크롭]
    E1 --> F[중복 제거<br>MSE 비교]
    E2 --> F
    E3 --> F
    F --> G[PDF + PNG 생성]

패턴 감지 우선순위

  1. overlay — 화면 위에 떠 있는 Tab 박스 (가장 구체적)
  2. split — 상단 Tab 용지 + 하단 핸드캠 (엄격한 밝기 기준)
  3. scroll — 상단 크롭 (기본 폴백)