视频转图片工具-程序员宅基地

技术标签: python  视频处理  Python  

将单个视频转成图片

参数

  • -i: 视频文件地址
  • -o: 图片输出文件夹地址
  • -f: 抽取帧数跨步

代码

核心就是cv2模块,先cv2.VideoCapture读取视频,然后通过cv对象的read()来获取每一个视频画面帧,进行进行存储等操作。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import cv2
import os
import argparse
import glob
import time
from common import init_logger, output_log
import shutil

'''
将单个视频文件转换成图片
'''

ROOT_DIR = os.path.abspath(os.path.dirname(__file__))
FILE_NAME = os.path.basename(__file__)[:-3]


def make_parser():
    parser = argparse.ArgumentParser(description="将视频转换成图片")
    parser.add_argument("-i", "--input", dest="input_path", required=True, help="待转换的视频或者视频目录", type=str)
    parser.add_argument("-o", "--output", dest="output_dir", required=True, help="输出目录", type=str)
    parser.add_argument("-f", "--frequency", dest="frequency", help="抽取祯的频度, 例如:当指定为10时,则抽取第10、20、30祯,...,依次类推", default=10, type=int)
    return parser


def save_frames(video_file, output_path, frequency):
    start_ms = int(time.time() * 1000)
    video_name = os.path.basename(video_file)[:-4]

    output_dir = os.path.join(output_path, video_name)
    if os.path.exists(output_dir):
        shutil.rmtree(output_dir)
    os.makedirs(output_dir)

    cap = cv2.VideoCapture(video_file)
    index = 0
    while True:
        flag, frame = cap.read()
        if flag:
            index += 1
            if(index % frequency == 0):
                # frame = frame[:, 1304:]
                path = os.path.join(output_dir, "%s_%04d.jpg" % (video_name, index))
                output_log(path)
                cv2.imencode('.jpg', frame)[1].tofile(path)
        else:
            break
    cap.release()
    cv2.destroyAllWindows()
    end_ms = int(time.time() * 1000)
    output_log("save_frames %s finished in %d ms" % (video_file, end_ms - start_ms))


def video_2_image(video_file, output_dir, frequency):
    if video_file.lower().endswith((".mkv", ".mp4", ".avi", ".mov")):
        save_frames(video_file, output_dir, frequency)


def main():
    init_logger(os.path.join(ROOT_DIR, FILE_NAME + '.log'))

    parser = make_parser()
    args = vars(parser.parse_args())
    input_path = args["input_path"]
    output_dir = args["output_dir"]
    frequency = args["frequency"]

    output_log("input_path: %s" % input_path)
    output_log("output_dir: %s" % output_dir)
    output_log("frequency: %d" % frequency)

    if os.path.isdir(input_path):
        for p in sorted(glob.glob(input_path + "/*.*")):
            video_2_image(p, output_dir, frequency)
    elif os.path.isfile(input_path):
        video_2_image(input_path, output_dir, frequency)


if __name__ == '__main__':
    main()


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41629756/article/details/109840910

智能推荐

实践作业:经典机器学习分类挑战——猫狗大战-程序员宅基地

文章浏览阅读909次,点赞24次,收藏15次。1.1问题描述Cats vs. Dogs(猫狗大战)是一道经典赛题,利用给定的包含猫、狗图片的数据集,用算法实现猫和狗的识别(二分类)。在这个问题中,你将面临一个经典的机器学习分类挑战——猫狗大战。你的任务是建立一个分类模型,能够准确地区分图猫狗大战你的目标是通过训练一个机器学习模型,使其在给定一张图像时能够准确地预测图像中是猫还是狗。模型应该能够推广到未见过的图像,并在测试数据上表现良好。将其部署到模拟的生产环境中——这里推理时间。

剑指Offer_编程题06:旋转数组的最小数字(二分法)_6、旋转(编程题)-程序员宅基地

文章浏览阅读223次。题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。牛客:链接LeetCode变体:LeetCode153:Find Minimum in Rotated So..._6、旋转(编程题)

html横向自动滚动代码,不间断无缝滚动代码(横向、竖向)-程序员宅基地

文章浏览阅读1.6k次。一个设定宽度并且隐藏超出它宽度的内容的容器demo,里面放demo1和demo2,demo1是滚动内容,demo2为demo1的直接克隆副本,通过不断改变demo1的scrollTop或者scrollLeft达到滚动的目的,当滚动至demo1与demo2的交界处时直接跳回初始位置,因为demo1与demo2一样,所以分不出跳动的瞬间,从而达到"无缝"滚动的目的。向上滚动:style=overflo..._横向代码

图像处理与计算机视觉的经典书籍-程序员宅基地

文章浏览阅读293次。************************************************************************************************************************************************************************************ 在这里,我特别..._image processing, analysis and machine vision pdf

心动女友框架分析-程序员宅基地

文章浏览阅读222次。文档结构一 游戏入口二 游戏统计三 视频播放、音频播放四 支付五 http通讯六 游戏配置文件七 关键字屏蔽八 新手指引文档结构cocos2d-js-min.js cocos引擎egreth5sdk.js 白鹭SDKexif.js ???gameApi.js ..._心动女友 系统繁忙,错误代码1007

git常用命令-程序员宅基地

文章浏览阅读57次。git配置信息查看.gitignore 过滤规则1.17 git log命令后如果用ctrl+c退出就会卡死,如果用q退出就没问题git checkout .撤销本次工作空间修改git branch 查看本地分支git branch -r 查看远程分支git branch -a 查看所有分支git branch -vv 查看本地分支与远程分支关系git 查看分支起源#删除本地分支..._git log 后按了ctrl d

随便推点

Window环境下Python不能卸载问题解决_pyt python 3,4,3 xthere is a problem with this win-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏4次。问题描述:windows10系统 python版本3.4.3用360软件管家或者是从电脑的控制面板里的程序都无法卸载都会提示以下内容:there is a problem with this windows installer package.A programe run as part of the setup did not finish as expected.Contact_pyt python 3,4,3 xthere is a problem with this windows installerpackage.

Idea2017部署项目到tomcat时增加Artifacts的步骤_idea ssh项目 artifacts部署到tomcat-程序员宅基地

文章浏览阅读4.4k次。1、在Idea2017中maven构建的项目部署到tomcat容器中时,选择Edit Configration部署时,需要配置Deployment属性,选择war或者war exploded的发布方式时。要进行这个配置首先要点击添加Artifact,如下图所示:点击下面的“+”号时,发现没有Artifact按钮选项(上图是有配置过的,所以是有的)。2、解决法办:settings–>..._idea ssh项目 artifacts部署到tomcat

情感分析的入门简介,从词法、句法分析开始,到基础模型及深度学习模型的介绍_情感分析入门-程序员宅基地

文章浏览阅读851次。情感分析(Sentiment Analysis)是自然语言处理中一个非常重要且广泛研究的领域,它可以帮助企业或组织更好地了解客户对产品或服务的态度,从而制定符合用户需求的营销策略或产品改进方向。随着互联网和社交媒体等信息化时代的到来,传播开放、消费高速增长,各行各业都在追求个性化服务与个性化体验。如何准确识别并理解客户的心情、倾向、情绪和喜好,无疑是众多消费者关切的重点。目前,情感分析技术已经成为一种热门话题,有关部门也积极推出了针对不同场景的情感分析工具或产品。_情感分析入门

《UG NX8.0中文版完全自学手册》一1.5 文件操作-程序员宅基地

文章浏览阅读518次。本节书摘来自异步社区《UG NX8.0中文版完全自学手册》一书中的第1章,第1.5节,作者 刘昌丽 , 周进,更多章节内容可以访问云栖社区“异步社区”公众号查看1.5 文件操作UG NX8.0中文版完全自学手册本节将介绍文件的操作,包括新建文件、打开和关闭文件、保存文件、导入导出文件操作设置等。1.5.1 新建文件菜单栏:选择菜单栏中的“文件”..._ug nx 8.0中文版完全自学手册

基于MFC的学生成绩管理系统_mfc fdlg.domodal()-程序员宅基地

文章浏览阅读483次。简单的MFC的课程设计,部分功能还没有优化,仅供参考_mfc fdlg.domodal()

C11新特性(部分)_c11特性-程序员宅基地

文章浏览阅读1.2k次,点赞6次,收藏15次。1.类型推导2.nullptr指针空值3.基于范围的for循环4.typedef与using5.新增容器_c11特性

推荐文章

热门文章

相关标签