Spaces:
Running
on
Zero
Running
on
Zero
import cv2 | |
import torch.nn.functional as F | |
import numpy as np | |
from src.utils import * | |
def insert_key(keys, ind): | |
for i, k in enumerate(keys): | |
if ind < k: | |
keys.insert(i, ind) | |
break | |
def get_maxinterv(keys): | |
maxinterv = 1 | |
for i in range(len(keys)-1): | |
tmp = keys[i+1]-keys[i] | |
if tmp > maxinterv: | |
maxinterv = tmp | |
return maxinterv | |
def get_keyframe_ind(filename, lastframen = 1e10, mininterv = 5, maxinterv = 20, viz = False): | |
if maxinterv == mininterv: | |
return list(range(0,lastframen,mininterv)) | |
video_cap = cv2.VideoCapture(filename) | |
n_frames = max(1, min(int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT)), lastframen)) | |
err = [0] | |
preframe = None | |
for i in range(n_frames): | |
success, frame = video_cap.read() | |
if not success: | |
break | |
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
img = resize_image(frame, 512) | |
img = cv2.GaussianBlur(img, (9, 9), 0.0) | |
if i == 0: | |
preframe = numpy2tensor(img) | |
else: | |
curframe = numpy2tensor(img) | |
err += [float(F.mse_loss(preframe, curframe).cpu().numpy())] | |
preframe = curframe | |
err = np.array(err) | |
err1 = np.array(err) | |
n_frames = len(err) | |
keys = [0, n_frames-1] | |
err[0:mininterv] = -1 | |
err[-mininterv:] = -1 | |
while get_maxinterv(keys) > maxinterv: | |
ind = np.argmax(err) | |
if err[ind] == -1: | |
break | |
err[ind-mininterv:ind+mininterv] = -1 | |
insert_key(keys, ind) | |
if viz: | |
plt.plot(err1) | |
plt.plot(keys, err1[keys], 'bo') | |
plt.show() | |
return keys |