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

@@ -0,0 +1,50 @@
import cv2
import numpy as np
import os
pdf_path = r"C:\Users\Certes\Desktop\guitar_score\output\shintakarajima_perfect.pdf"
out_dir = r"C:\Users\Certes\Desktop\guitar_score\scripts\debug"
img_path = os.path.join(out_dir, "verify_chunk_0.jpg") # from previous sessions
if not os.path.exists(img_path):
print("verify_chunk_0.jpg not found. extracting a page from PDF...")
import fitz
doc = fitz.open(pdf_path)
page = doc.load_page(0)
pix = page.get_pixmap(dpi=150)
pix.save(os.path.join(out_dir, "pdf_test_page.png"))
img_path = os.path.join(out_dir, "pdf_test_page.png")
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, bin_inv = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)
h, w = img.shape[:2]
staff_y_top = int(h * 0.3)
row_sums = np.sum(bin_inv[:, :min(w, 1000)], axis=1) / 255.0
staff_rows = np.where(row_sums > min(w, 1000) * 0.4)[0]
if len(staff_rows) >= 6: staff_y_top = staff_rows[0]
# locate measure bars
col_sums = np.sum(bin_inv[staff_y_top:staff_y_top+100, :], axis=0) / 255.0
bar_xs = np.where(col_sums > 30)[0]
bars = []
if len(bar_xs) > 0:
curr = [bar_xs[0]]
for x in bar_xs[1:]:
if x - curr[-1] < 10: curr.append(x)
else:
bars.append(int(np.mean(curr)))
curr = [x]
bars.append(int(np.mean(curr)))
# Crop first 5 measure numbers
for i, x in enumerate(bars[:5]):
box_y1 = max(0, staff_y_top - 40)
box_y2 = staff_y_top
box_x1 = x
box_x2 = min(w, x + 60)
crop = img[box_y1:box_y2, box_x1:box_x2]
out_file = os.path.join(out_dir, f"measure_num_{i}.png")
cv2.imwrite(out_file, crop)
print(f"Saved measure number crop to {out_file}")