从视频中截取帧
python-opencv 使用ffmpeg 代码
输入视频,输出视频中的每一帧图片,并保存,以及整个视频的帧数。
from __future__ import print_function
import sys
import numpy as np
import os
import imageio
import cv2
Height = 256
Width = 256
file_dir = "视频路径"
with imageio.get_reader(file_dir, 'ffmpeg') as vid:
nframes = vid.get_meta_data()['nframes']
for i, frame in enumerate(vid):
n_frames = i
frame = cv2.resize(frame, (Width, Height), interpolation = cv2.INTER_CUBIC)
imageio.imwrite("/home/xueqian/bishe/extrat_feature/output"+'/frame_%d.jpg' %i, frame)
np.save('nframes.npy', n_frames)
使用TVL1提取光流
提取光流flow,输入视频的连续多帧图片,输出相邻帧中的光流。
import os
import numpy as np
import cv2
from glob import glob
_IMAGE_SIZE = 256
def cal_for_frames(video_path):
frames = glob(os.path.join(video_path, '*.jpg'))
frames.sort()
flow = []
prev = cv2.imread(frames[0])
prev = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)
for i, frame_curr in enumerate(frames):
curr = cv2.imread(frame_curr)
curr = cv2.cvtColor(curr, cv2.COLOR_BGR2GRAY)
tmp_flow = compute_TVL1(prev, curr)
flow.append(tmp_flow)
prev = curr
return flow
def compute_TVL1(prev, curr, bound=15):
"""Compute the TV-L1 optical flow."""
TVL1 = cv2.DualTVL1OpticalFlow_create()
flow = TVL1.calc(prev, curr, None)
assert flow.dtype == np.float32
flow = (flow + bound) * (255.0 / (2*bound))
flow = np.round(flow).astype(int)
flow[flow >= 255] = 255
flow[flow <= 0] = 0
return flow
def save_flow(video_flows, flow_path):
for i, flow in enumerate(video_flows):
cv2.imwrite(os.path.join(flow_path.format('u'), "{:06d}.jpg".format(i)),
flow[:, :, 0])
cv2.imwrite(os.path.join(flow_path.format('v'), "{:06d}.jpg".format(i)),
flow[:, :, 1])
def extract_flow(video_path,flow_path):
flow = cal_for_frames(video_path)
save_flow(flow, flow_path)
print('complete:' + flow_path)
return
if __name__ =='__main__':
video_paths="/home/xueqian/bishe/extrat_feature/output"
flow_paths="/home/xueqian/bishe/extrat_feature/flow"
video_lengths = 109
extract_flow(video_paths, flow_paths)
参考:
提取光流