feat(pipeline): YouTube Tab → PDF 자동 추출 파이프라인 초기 구현
- 5단계 파이프라인: 다운로드 → 프레임 추출 → 패턴 감지 → 중복 제거 → PDF 생성 - 3가지 패턴 지원: overlay, split, scroll - MSE 기반 픽셀 비교 프레임 중복 제거 - split 모드: 42% 크롭 + 밝기 필터 + Tab 라인 검증 - overlay 모드: 320x120 정규화 + 슬라이딩 윈도우 비교 - 프로젝트 문서 초기 작성 (architecture, tech-stack, STATUS, known-issues)
This commit is contained in:
58
.agent/references/architecture.md
Normal file
58
.agent/references/architecture.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# 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 |
|
||||
|
||||
## 데이터 흐름
|
||||
|
||||
```mermaid
|
||||
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** — 상단 크롭 (기본 폴백)
|
||||
Reference in New Issue
Block a user