从视频中提取帧并提取光流

从视频中截取帧

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)

参考:
提取光流

猜你喜欢

转载自blog.csdn.net/qq_32799915/article/details/85704240
今日推荐