chore(docs): document ScoreExtractor tiling and refactor debug scripts (#563)

This commit is contained in:
2026-03-29 17:57:40 +09:00
parent 39b55f2e9f
commit ac0c098259
698 changed files with 141180 additions and 195 deletions

View File

@@ -0,0 +1,61 @@
import cv2
import numpy as np
import easyocr
import os
from pathlib import Path
from youtube_tab_to_pdf import _find_white_tab_strip, _has_tab_content, _extract_print_channel, _detect_measure_bars
def main():
url = "https://youtu.be/tJq1n8TofM0"
video_path = Path("output/サカナクション/新宝島(エレキギターTAB) 難易度★★★ sakanaction shintakarajima.mp4")
artifact_dir = Path(r"C:\Users\Certes\.gemini\antigravity\brain\975cea00-dd68-4689-9ee3-f1a2408b4ee6")
cap = cv2.VideoCapture(str(video_path))
ret, frame = cap.read()
strip = _find_white_tab_strip(frame)
top, bottom = strip[0], strip[1]
tab_crop = frame[max(0, top):min(frame.shape[0], bottom), :]
gray_page = _extract_print_channel(tab_crop)
bar_coords = _detect_measure_bars(gray_page)
coords = [0] + bar_coords + [tab_crop.shape[1]]
coords = sorted(list(set(coords)))
reader = easyocr.Reader(['en'], verbose=False)
for i in range(len(coords) - 1):
x_start = coords[i]
x_end = coords[i+1]
measure_w = x_end - x_start
if measure_w < 30: continue
m_img = tab_crop[:, x_start:x_end]
# Extract Number Sprite precisely
gray = cv2.cvtColor(m_img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)
row_sums = np.sum(thresh, axis=1) / 255
staff_lines = np.where(row_sums > m_img.shape[1] * 0.5)[0]
if len(staff_lines) > 0:
y_staff = staff_lines[0]
# 상단 45px, 좌측 70px 크롭
crop_y1 = max(0, y_staff - 45)
crop_y2 = y_staff
sprite = thresh[crop_y1:crop_y2, 0:min(70, m_img.shape[1])]
out_file = artifact_dir / f"debug_sprite_{i}.png"
cv2.imwrite(str(out_file), sprite)
# OCR
upscaled = cv2.resize(sprite, (0, 0), fx=4.0, fy=4.0, interpolation=cv2.INTER_CUBIC)
res = reader.readtext(upscaled, allowlist='0123456789', detail=0)
print(f"Measure {i}: Found text = {res}")
cap.release()
if __name__ == "__main__":
main()