视频2图片video_to_images

视频2图片video_to_images

本程序主要讲视频转化为图片

创建video_to_images.py

#-*- coding: utf-8 -*-
#使用本程序的方法:
#1. 安装python3
#2. 安装numpy, 命令 pip3 install numpy
#3. 安装opencv-python, 命令:pip3 install opencv-python
#4. 将该脚本放置在存储视频的文件夹中,利用python执行此脚本。

import os
import sys
filedir = os.path.dirname(sys.argv[0])      #获取脚本所在目录
os.chdir(filedir)       #将脚本所在的目录设置为工作目录
wdir = os.getcwd()
print('当前工作目录:{}\n'.format(wdir))      #打印当前工作目录

import numpy as np
import cv2 as cv;
import re
from math import ceil

def video_to_image(video_path):
    print('\n-----------------------------------------------------------------------------')
    print('正在处理视频:{}\n'.format(video_path))
    
    video_dir = os.path.dirname(video_path)
    video_name = os.path.basename(video_path)
    
    image_dir = re.sub('\.','_',video_name)
    image_dir = os.path.join(video_dir, image_dir)
    if not os.path.exists(image_dir):
        os.mkdir(image_dir)

    cap = cv.VideoCapture(video_path)
    # Define the codec and create VideoWriter object
    fps = cap.get(5)   #视频帧率
    width = cap.get(3)
    height = cap.get(4)
    sample_rate = round(fps)   #采样率,目前设置为每秒取1帧。
    
    #print("视频  {}  的帧率为:{:.2f}  分辨率为:{} ✖ {}".format(video_path, fps, width, height))
    print("视频  {} 的帧率为:{}  分辨率为:{} * {}".format(video_path, fps, width, height))
	
    n=0
    new_img_num = 0
    old_img_num = 0
    while(cap.isOpened()):
        ret, frame = cap.read()
        if ret==True:
            #cv.imshow('frame1', frame)
            n=n+1
            
            if n%sample_rate == 1:
                
                image_name = video_name+'_'+str(n)+'.jpg'
                image_path = os.path.join(image_dir, image_name)
                if os.path.exists(image_path):
                    print('{}  已经存在。'.format(image_path))
                    old_img_num += 1
                else :
                    print(image_path)
                    cv.imwrite(image_path,frame)
                    new_img_num += 1
            
            if cv.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break
        
    # Release everything if job is finished

    cap.release()
    print('视频处理完毕,共{}帧。每{}帧采1张,可生成{}张图片。\n'.format(n, sample_rate, ceil(n/sample_rate)))
    print('此前已有图片{}张,本次生成{}张。\n'.format(old_img_num, new_img_num))

ext = ('.h264', '.MOV')
#遍历工作目录,并对其中指定格式的视频文件进行处理。    
# def search(path):
    # for p in os.listdir(path):
        # p = os.path.join(path, p)
        # if os.path.isdir(p):
            # search(p)
        # elif p.endswith(ext):
            # video_to_image(p)

# search(wdir) 

for dirpath, dirname, filename in os.walk(wdir):
    for f in filename:
        if f.endswith(ext):
            video_path = os.path.join(dirpath, f)
            video_to_image(video_path)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2158.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何运行一个vue项目(github安装项目依赖)

    1.cd到package.json目录中,执行npmoutdatedPackageCurrentWantedLatestLocation包名当前版本满足semer版本的最高版本(及在兼容的前提下能更新的最高版本)当前最高的版本红色:可以立即更新黄色:需要进行兼容,慎重更新全部更新在已有项目中,不建议采用全部更新,推荐使用npmupdate按需更新安装ncu,执行npminstall-gnpm-check-updates执行ncu-u

    2022年4月16日
    80
  • 安卓系统框架介绍(安卓常用框架)

    一、什么是Android?Android是由谷歌公司开发的一种基于Linux的开源的操作系统。——源码地址1:https://android.googlesource.com/——源码地址2:http://androidxref.com/起初专为移动设备开发的一个操作系统,如手机,平板电脑,车载系统,智能电视等。Android第一个版本2008年11月发布,至今有超过…

    2022年4月14日
    548
  • Python任务调度模块 – APScheduler

    Python任务调度模块 – APScheduler

    2021年9月14日
    70
  • 计算机网络之TCP/UDP协议详解[通俗易懂]

    计算机网络之TCP/UDP协议详解[通俗易懂]深度理解TCP/IP1.TCP基础知识1.1什么是TCP?1.2什么是TCP连接?1.3TCP协议段格式1.4TCP主要特点2.UDP基础知识2.1UDP是什么?2.2UDP的协议段格式2.3UDP的主要特点2.4UDP的缓冲区3.TCP和UDP区别总结4.TCP保证可靠的机制4.1重传机制(这里只说了超时重传)4.2滑动窗口4.3流量控制4.3拥塞控制1.TCP基础知识1.1什么是TCP?TCP是⾯向连接的、可靠的、面向字节流的传输层通信协议面向连接:只能一对一连接,

    2022年5月9日
    34
  • 工具类BeanMap,BeanCopier

    工具类BeanMap,BeanCopier对象之间的转换;深度复制;1,BeanMap实现的是Map接口;将对象转换成Map非常简单;2,BeanCopier深度复制;Demo主要类:Test:/***Createdbyadminon2017/3/7.*/publicclassTest{publicstaticvoidmain(String[]args){

    2022年9月5日
    2
  • JVM内存管理及GC机制[通俗易懂]

    JVM内存管理及GC机制[通俗易懂]一、概述JavaGC(GarbageCollection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。经过这么长时间的发展,JavaGC…

    2022年5月2日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号