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

从视频中截取帧

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)

参考:
提取光流

  • 10
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值