fix(cv): resolve infinite page duplication bug caused by playback cursor

This commit is contained in:
2026-03-29 21:23:18 +09:00
parent ac0c098259
commit 3377b5f68d
23 changed files with 779 additions and 465 deletions

View File

@@ -27,6 +27,7 @@ Raw Frames → HSV Strip 검출 → Median Crop → MSE 1차 → 파노라마
| 날짜 | 변경 내용 |
|------|-----------|
| 2026-03-29 | **[BUG4]** 재생 커서의 픽셀 면적 비중에 따른 무한 페이지 복제 버그 탈피 → 가로폭(Column) 변화율 기반 감지 공식 전면 교체 |
| 2026-03-29 | **[REFACTOR]** `ScoreExtractor` 객체지향 타일링 도입 (A4 크롭 오차 방지) 및 디버그 분리 |
| 2026-03-27 | **[BUG1]** `_merge_scroll_candidates` 씬전환 가속도 조건 제거 → 씬전환 오탐 9→1 |
| 2026-03-27 | **[BUG2]** `merge_panoramas_list` 매칭 임계치 0.60→0.50 → 파노라마 분리 3→1 |
@@ -39,6 +40,5 @@ Raw Frames → HSV Strip 검출 → Median Crop → MSE 1차 → 파노라마
## 알려진 제한사항
- 프레임 하단 기타리스트 영상이 탭 행 아래에 소량 노출됨 (`_trim_to_content` 개선 필요)
- 순차 영상 처리 시 메모리 누적 주의 (gc.collect 필수)
- test_pipeline.py 아직 메인 코드와 완전 통합 안 됨

View File

@@ -114,3 +114,10 @@
- **원인**: 영상 내 플레이헤드의 옅은 회색 잔상(200~220)이 씬 전환을 오탐, 이후 이중 병합 시도. ORB/SIFT 기반의 특징점 추출기는 반복 화성이 많은 기타 탭 악보 특성상 "11마디와 12마디"를 시각적으로 같은 곳이라 착각하여 다른 마디 위치로 강제 Overlap 시킴.
- **해결**: `cv2.threshold(THRESH_BINARY_INV)`로 플레이헤드를 물리적 삭제하여 씬오탐 근절. Canny Edge 기반 1D Morphological `matchTemplate` 스티칭으로 롤백. 스크롤 탭에서 불필요한 Full-Page 덮어쓰기 로직 원천 차단.
- **주의**: 단순 배경/글자 매칭이 아닌 *반복적 패턴*이 생명인 악보에서는 부분 특징점 매칭(ORB) 알고리즘이 픽셀의 시계열 순서(Monotonicity)를 완전히 망가뜨림. 1D Correlation 윈도우 스티칭이 음악의 선형 복원에는 더 정교함.
### [2026-03-29] <20><><EFBFBD><EFBFBD>(Area) <20><><EFBFBD><EFBFBD> <20>ǽ<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> ? <20><><EFBFBD><EFBFBD> Ŀ<><C4BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
- **<2A><><EFBFBD><EFBFBD>**: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD>ݸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD> <20><><EFBFBD><EFBFBD>(43<34><33> <20>̻<EFBFBD>)<29><>
- **<2A><><EFBFBD><EFBFBD>**: <20>ȼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(Area)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѱ<EFBFBD><D1B1><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>Ķ<EFBFBD><C4B6><EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> <20><>ǥ<EFBFBD><C7A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><> <20>߻<EFBFBD><DFBB>ϴ<EFBFBD> <20>ȼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѱ<EFBFBD> <20>ȼ<EFBFBD> <20><EFBFBD><E7BAB8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>
- **<2A>ذ<EFBFBD>**: <20><><EFBFBD><EFBFBD> <20><>(col_sums)<29><> <20>̿<EFBFBD><CCBF><EFBFBD> '<27><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Column)'<27><> ũ<><C5A9> <20><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> 1D <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>м<EFBFBD> <20><><EFBFBD><EFBFBD>. Ŀ<><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<5%)<29><> <20><>õ <20><><EFBFBD><EFBFBD>
- **<2A><><EFBFBD><EFBFBD>**: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(Ŀ<><C4BF> <20><><EFBFBD><EFBFBD> > <20><>ȭ <20><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> Median<61>̳<EFBFBD> Tesseract <20><> <20><>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ذ<EFBFBD>å<EFBFBD><C3A5> <20><> <20><> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> Ǯ <20><>