当前位置: 首页 > article >正文

简单代码实现视频转图片_py

目录

1.安装OpenCV

环境要求

安装命令

验证安装

2. OpenCV用法

3.实现程序 


博主最近在研究深度学习,需要收集数据集进行处理,但一张张拍照真是太麻烦了

就想着,哎,能不能写一个程序,把视频转成图片不就行了?

正好,博主知道Python中就有一个库可以做到哎。

import cv2

是的,就是咱们强大的cv2库了

这是一个处理视频很好用的库,既然如此,我们就来看看我们需要的用法吧。

1.安装OpenCV

环境要求

确保你的Python版本至少为3.6以上,推荐使用Python 3.8。

安装命令

在你的Python环境中安装OpenCV非常简单,使用pip即可

pip install opencv-python

验证安装

安装完成后,可以通过以下Python代码来验证cv2模块是否正确安装

import cv2
print(cv2.__version__) 

2. OpenCV用法

大家直接去官方文档里看吧,这边就不具体介绍了,因为这个库真是太强大了。

      OpenCV官方文档           OpenCV中文文档

当然,还是推荐大家(如果英语好的话)使用官方文档,毕竟别人翻译的终究不准确。

3.实现程序 

首先我们需要创建两个文件夹目录来存储我们的图片与视频

import cv2

#视频路径
video_path = r'D:video\1.mp4'

#1.mp4就是我们的视频

#图片保存路径
out_path = 'D:images/'

接下来,我们就需要对视频进行读取,我们先创建一个实例化对象

videocapture = cv2.VideoCapture(video_path) #创建一个实例化对象(捕捉视频)

success, frame = videocapture.read() #输出success表示是否读到帧

print("success is")
print(success)

这边我们运行一下代码,出现这段文件就说明我们视频读取成功了 

 这时候我们就需要设置一下读取视频的参数了,代码中注释的很清楚,就不过多解释

is_all_frame = True #是否取所有帧

sta_frame = 1 # 起始帧

end_frame = 1000 #结束帧

time_interval = 8 #时间间隔,多少帧存一次

 根据我们的参数可以知道,我们每8帧就需要存储一次,自然就需要一个循环来不停的存储我们的

图片。有了循环,自然就得有循环结束的条件。接下来,看代码。

i = 0
j = 0  # 为了编号,防止图片编号跳着来 1,8,16....
while success:
    i += 1
    if i % time_interval == 0:
        if not is_all_frame:
            if sta_frame <= i <= end_frame: #i在启始帧和结束帧之间运行循环
                j += 1
                print("save frame", j)
                save_image(out_path, frame, j)
            elif i > end_frame:
                break
        else:
            j += 1
            print("save frame", j)
            save_image(out_path, frame, j)

   # 每次调用读取一帧
    success, frame = videocapture.read()

# save_image(out_path, frame, j)保存图片的函数,暂时可以不看,下面会讲
# 变量j也可以暂时不看

循环有了,我们就要写我们需要用的具体函数了。

这边我们定义一个save_image() 函数,设置几个参数,分别存放我们的目录,每一帧图片,图

片的编号 j 。

为什么我们需要编号呢?

如果我们直接用frame作为编号,就会出现编号跳跃的情况,8,16,24...

这样看着会很难受,引入 j 只是为了让我们看的方便些。

接下来,看代码

def save_image(addr, image, num):  #目录,每一帧,编号

    address = addr + 'img_' + str(num) + '.jpg' #路径以及文件保存的名字

    print(address) #输出路径,为了直观一点

    cv2.imwrite(address, image) #转换图片的主要程序

这样,我们就可以完成一个简单的视频转图片的程序了。

4.完整代码

import cv2

#这边的路径是博主自己进行深度学习的目录,改为你们自己的就可以了

#视频路径
video_path = r'D:\yolo\yolov5-6.0\labelimg\video\1.mp4'
#图片路径
out_path = 'D:/yolo/yolov5-6.0/labelimg/images/'


# 保存图片函数
def save_image(addr, image, num):  #目录,图片,编号
    address = addr + 'img_' + str(num) + '.jpg'
    print(address)
    cv2.imwrite(address, image)



is_all_frame = True #是否取所有帧
sta_frame = 1 # 起始帧
end_frame = 1000 #结束帧

# 这边可以根据需要自定义
# 拍摄视频 1s有60帧 (具体看自己相机设置)
time_interval = 8 #时间间隔,多少帧存一次

videocapture = cv2.VideoCapture(video_path) #创建一个实例化对象(捕捉视频)
success, frame = videocapture.read() #success表示是否读到帧
print("success is")
print(success)


i = 0
j = 0  # 为了编号,防止图片编号跳着来 1,8,16....
while success:
    i += 1
    if i % time_interval == 0:
        if not is_all_frame:
            if sta_frame <= i <= end_frame:
                j += 1
                print("save frame", j)
                save_image(out_path, frame, j)
            elif i > end_frame:
                break
        else:
            j += 1
            print("save frame", j)
            save_image(out_path, frame, j)
   # 每次调用读取一帧
    success, frame = videocapture.read()

 

 

 

 


http://www.kler.cn/a/307770.html

相关文章:

  • YOLO系列基础(七)从数据增强到图像线性变换
  • openwebui二改界面环境搭建
  • change buffer:到底应该选择普通索引还是唯一索引
  • Java 多线程(三)—— 死锁
  • 密码学的基本原理
  • ❤React-React 组件基础(类组件)
  • 在Flask中实现日志记录
  • 动态ip切换频率是快点好还是慢点好
  • Mybatis批量操作
  • Java 使用 Redis
  • 并发容器(Map、List、Set)实战及其原理分析
  • 如何快速清理Docker中的停止容器?
  • HFish开源蜜罐系统常见问题排查
  • 10- 【JavaWeb】Tomcat、Servlet基础
  • springboot后端开发-常见注解及其用途
  • C++ this指针
  • 【高中数学/三角函数/判别式法】设x>0,y>0,x+2y=5,则(x+1)(2y+1)/(xy)^0.5的最小值为?
  • dedecms(四种webshell姿势)、aspcms webshell漏洞复现
  • VMWare中的Centos8:Errors during downloading metadata for repository ‘appstream‘
  • 0基础跟德姆(dom)一起学AI 数据处理和统计分析02-Linux进阶
  • S3C2440开发板点亮LED灯+PWM定时器
  • 深入理解图卷积网络(4)
  • 极狐GitLab DevSecOps 功能合集(七大安全功能)
  • Untiy中给资源名改大小写
  • 程易科技AI OS:赋能开发者,构建智慧未来
  • golang学习笔记21——golang协程管理及sync.WaitGroup的使用