Files
guitar_score/scripts/debug/debug_overlap.py

99 lines
3.1 KiB
Python

import cv2
import numpy as np
import sys
import glob
# Test matching between two chunks to see what the score was!
# Wait, the chunks are the output of the slicing!
# The tracker works on the original FRAMES!
# Let's test the tracker on the original frames!
# I will supply the exact logic used in the tracker.
def test_tracker():
video_file = r"C:\Users\Certes\Desktop\guitar_score\output\サカナクション/新宝島(エレキギターTAB) 難易度★★★ sakanaction shintakarajima.mp4"
cap = cv2.VideoCapture(video_file)
panorama = None
last_clean_frame = None
in_transition = False
last_conf = 1.0
count = 0
saved_matches = []
while True:
ret, frame = cap.read()
if not ret: break
count += 1
if count % 15 != 0: # fps=2
continue
frame = cv2.resize(frame, (1280, 720))
if panorama is None:
panorama = frame.copy()
last_clean_frame = frame.copy()
continue
# calculate shift
prev_chan = last_clean_frame[:, :, 0]
curr_chan = frame[:, :, 0]
w = 1280
template_w = int(w * 0.3)
start_x = int(w * 0.6)
template = prev_chan[:, start_x:start_x + template_w]
res = cv2.matchTemplate(curr_chan, template, cv2.TM_CCOEFF_NORMED)
_, conf, _, max_loc = cv2.minMaxLoc(res)
dx = start_x - max_loc[0]
if conf < 0.15 or dx <= 0:
dx = 0
if dx > w * 0.15:
dx = 0
if (conf < 0.45) or (last_conf - conf > 0.3):
in_transition = True
elif in_transition and conf > 0.85 and dx == 0:
in_transition = False
# overlap logic
h = panorama.shape[0]
new_page = frame.copy()
search_w = min(1500, panorama.shape[1])
search_region = panorama[:, -search_w:, 0]
head_w = min(400, new_page.shape[1])
head = new_page[:, 50:50+head_w, 0]
res2 = cv2.matchTemplate(search_region, head, cv2.TM_CCOEFF_NORMED)
_, max_val, _, matched_loc = cv2.minMaxLoc(res2)
saved_matches.append(max_val)
print(f"Page turn detected! Overlap match score: {max_val:.4f} at {matched_loc}")
if max_val > 0.65:
overlap_px = search_w - matched_loc[0] + 50
if overlap_px < new_page.shape[1] - 50:
panorama = np.hstack([panorama, new_page[:, overlap_px:]])
else:
pass
else:
panorama = np.hstack([panorama, new_page])
elif dx > 0 and dx < w and not in_transition:
new_strip = frame[:, w - dx:, :]
panorama = np.hstack([panorama, new_strip])
last_conf = conf
last_clean_frame = frame.copy()
if len(saved_matches) >= 3:
break
cap.release()
print("Test complete.")
if __name__ == "__main__":
test_tracker()