chore(docs): document ScoreExtractor tiling and refactor debug scripts (#563)
This commit is contained in:
64
scripts/debug/dump_sprites.py
Normal file
64
scripts/debug/dump_sprites.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import cv2
|
||||
import numpy as np
|
||||
import os
|
||||
from glob import glob
|
||||
|
||||
video_path = glob('output/*.mp4')[0]
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
|
||||
def _find_white_tab_strip(frame):
|
||||
h, w = frame.shape[:2]
|
||||
gray = np.max(frame, axis=2)
|
||||
_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
|
||||
row_white_counts = np.sum(binary > 0, axis=1)
|
||||
|
||||
threshold = w * 0.1
|
||||
white_rows = np.where(row_white_counts > threshold)[0]
|
||||
if len(white_rows) < 5: return None
|
||||
return white_rows[0], white_rows[-1]
|
||||
|
||||
def get_number_sprite(m_img):
|
||||
gray = np.max(m_img, axis=2)
|
||||
_, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
|
||||
row_sums = np.sum(thresh, axis=1) / 255
|
||||
staff_lines = np.where(row_sums > m_img.shape[1] * 0.5)[0]
|
||||
y_staff = staff_lines[0] if len(staff_lines) > 0 else 50
|
||||
|
||||
crop_y1 = max(0, y_staff - 35)
|
||||
crop_y2 = max(0, y_staff - 2)
|
||||
crop_x1 = 0
|
||||
crop_x2 = min(60, m_img.shape[1])
|
||||
|
||||
if crop_y2 <= crop_y1 or crop_x2 <= crop_x1: return None
|
||||
return thresh[crop_y1:crop_y2, crop_x1:crop_x2]
|
||||
|
||||
frame_count = 0
|
||||
found = 0
|
||||
while True:
|
||||
ret, frame = cap.read()
|
||||
if not ret: break
|
||||
if frame_count % 30 == 0:
|
||||
strip = _find_white_tab_strip(frame)
|
||||
if strip:
|
||||
tab_crop = frame[max(0, strip[0]):min(frame.shape[0], strip[1]), :]
|
||||
|
||||
# _detect_measure_bars inline
|
||||
b_gray = np.max(tab_crop, axis=2)
|
||||
_, b_bin = cv2.threshold(b_gray, 180, 255, cv2.THRESH_BINARY)
|
||||
col_sums = np.sum(b_bin, axis=0) / 255
|
||||
bars = np.where(col_sums > tab_crop.shape[0] * 0.8)[0]
|
||||
|
||||
if len(bars) > 1:
|
||||
x_start = bars[0]
|
||||
x_end = bars[1]
|
||||
if x_end - x_start > 40:
|
||||
first_m = tab_crop[:, x_start:x_end]
|
||||
sprite = get_number_sprite(first_m)
|
||||
if sprite is not None:
|
||||
pixels = np.count_nonzero(sprite > 127)
|
||||
cv2.imwrite(f"C:/Users/Certes/Desktop/guitar_score/debug_s_{frame_count}_{pixels}.png", sprite)
|
||||
print(f"Dumped sprite frame {frame_count} with {pixels} pixels")
|
||||
found += 1
|
||||
if found > 15: break
|
||||
frame_count += 1
|
||||
cap.release()
|
||||
Reference in New Issue
Block a user