|
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 |