76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
import cv2
|
|
import numpy as np
|
|
import easyocr
|
|
import re
|
|
from youtube_tab_to_pdf import TemporalTracker
|
|
|
|
cap = cv2.VideoCapture(r"C:\Users\Certes\Desktop\guitar_score\output\shintakarajima.mp4")
|
|
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
fps = cap.get(cv2.CAP_PROP_FPS)
|
|
|
|
tracker = TemporalTracker()
|
|
cap.set(cv2.CAP_PROP_POS_FRAMES, 500)
|
|
ret, check_frame = cap.read()
|
|
|
|
from youtube_tab_to_pdf import _find_white_tab_strip
|
|
bounds = _find_white_tab_strip(cv2.resize(check_frame, (1280, int(check_frame.shape[0] * (1280/check_frame.shape[1])))))
|
|
if bounds:
|
|
crop_top = max(0, bounds[0] - 60)
|
|
crop_bottom = bounds[1]
|
|
tracker.set_crop(crop_top, crop_bottom)
|
|
|
|
# Process only first 95 seconds to get unique pages
|
|
print("Extracting unique pages from first 95 seconds...")
|
|
tracker.process_video(cap, start_sec=0, end_sec=95)
|
|
unique_pages = tracker.get_unique_pages()
|
|
|
|
print(f"Extracted {len(unique_pages)} unique pages.")
|
|
|
|
# Try easyOCR
|
|
reader = easyocr.Reader(['en'], gpu=False)
|
|
|
|
def extract_measure_number(page_bgr):
|
|
cw = min(page_bgr.shape[1], 1000)
|
|
page_gray = cv2.cvtColor(page_bgr[:, :cw], cv2.COLOR_BGR2GRAY)
|
|
_, bin_inv = cv2.threshold(page_gray, 200, 255, cv2.THRESH_BINARY_INV)
|
|
row_sums = np.sum(bin_inv, axis=1) / 255.0
|
|
staff_rows = np.where(row_sums > cw * 0.4)[0]
|
|
|
|
if len(staff_rows) >= 6:
|
|
staff_y_top, staff_y_bottom = staff_rows[0], staff_rows[-1]
|
|
for r in staff_rows:
|
|
if r - staff_y_top > 100: break
|
|
staff_y_bottom = r
|
|
else:
|
|
return -1
|
|
|
|
expected_h = max(10, staff_y_bottom - staff_y_top + 1)
|
|
staff_region = bin_inv[staff_y_top:staff_y_bottom+1, :]
|
|
col_sums = np.sum(staff_region, axis=0) / 255.0
|
|
bar_xs = np.where(col_sums >= expected_h * 0.8)[0]
|
|
|
|
if len(bar_xs) == 0: return -1
|
|
x_bar = bar_xs[0]
|
|
|
|
box_y1 = max(0, staff_y_top - 25)
|
|
box_y2 = staff_y_top
|
|
box_x1 = x_bar
|
|
box_x2 = min(page_gray.shape[1], x_bar + 35)
|
|
|
|
num_box = page_gray[box_y1:box_y2, box_x1:box_x2]
|
|
_, num_inv = cv2.threshold(num_box, 200, 255, cv2.THRESH_BINARY_INV)
|
|
num_for_ocr = cv2.bitwise_not(num_inv)
|
|
|
|
upscaled = cv2.resize(num_for_ocr, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
|
|
padded = cv2.copyMakeBorder(upscaled, 20, 20, 20, 20, cv2.BORDER_CONSTANT, value=[255, 255, 255])
|
|
|
|
results = reader.readtext(padded, allowlist="0123456789")
|
|
if not results: return -1
|
|
|
|
digits = re.findall(r'\d+', results[0][1])
|
|
return int(digits[0]) if digits else -1
|
|
|
|
for i, page in enumerate(unique_pages):
|
|
num = extract_measure_number(page)
|
|
print(f"Page {i:02d}: {num}")
|