99 lines
3.1 KiB
Python
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()
|