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,48 @@
import cv2
import numpy as np
import glob
video_path = glob.glob('output/*.mp4')[0]
cap = cv2.VideoCapture(video_path)
cap.set(cv2.CAP_PROP_POS_FRAMES, 500) # jump to a frame with chords and hand
ret, frame = cap.read()
cap.release()
if not ret:
print("Cannot read video frame.")
exit()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY) # White text, black background
# Morphological horizontal line detection
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40, 1))
detect_horizontal = cv2.morphologyEx(binary, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
# Morphological vertical line detection
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 30))
detect_vertical = cv2.morphologyEx(binary, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
# Find staves
row_sums = np.sum(detect_horizontal, axis=1) / 255
y_staves = np.where(row_sums > binary.shape[1] * 0.4)[0]
if len(y_staves) > 0:
print(f"Top staff line Y: {y_staves[0]}")
print(f"Bottom staff line Y: {y_staves[-1]}")
# Restrict vertical detection to within the staff lines
staff_crop = detect_vertical[y_staves[0]:y_staves[-1], :]
col_sums = np.sum(staff_crop, axis=0) / 255
bars = np.where(col_sums > (y_staves[-1] - y_staves[0]) * 0.6)[0]
# Filter bars that are too close (thickness)
clean_bars = []
for x in bars:
if not clean_bars or x - clean_bars[-1] > 10:
clean_bars.append(x)
print(f"Measure bars X: {clean_bars}")
else:
print("No staves detected.")
cv2.imwrite("C:/Users/Certes/Desktop/guitar_score/debug_morph_horiz.png", detect_horizontal)
cv2.imwrite("C:/Users/Certes/Desktop/guitar_score/debug_morph_vert.png", detect_vertical)