QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2907|回复: 0
打印 上一主题 下一主题

opencv逐帧获取视频图片

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-20 10:47 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
背景) ^- z& L# R' n" ]4 o( X/ O8 T/ d
由于我要做一个深度学习方向的计算机视觉项目,需要一些数据集来进行训练,我便想尝试捕获视频中的图片用来标注。  m: g* Y& v; @* O1 I$ u$ ?8 i0 @
* c) _  N+ |  O! g- Z
注意事项
* U9 q5 i' u& g( l* l4 i如果视频中的场景单一,那么使用该视频获取的数据集训练出的模型面对其他场景的泛化能力就会受到限制。为了提高数据集的多样性,可以采用多种不同场景的视频,并且在获取数据时采用大间隔捕获的方式。采用大间隔捕获数据的方法可以捕获到的图片同质化降低,从而进一步增加数据集的多样性。
  1. import os, Z; x: q% z( I\" d
  2. import sys
    2 g* w' D2 q4 ?3 m  R
  3. from concurrent.futures import ThreadPoolExecutor8 x/ v. A* F6 I$ L, D! y8 H
  4. import cv2
    1 C9 H3 P: Z* i; {

  5.   D  p1 P2 n7 q4 e. ^1 ]
  6. def output_img(video_path,img_dir):. ~- }# B* z! @- T1 w8 T* C* }
  7. #     由视频逐帧输出图片
    $ K- h; M( j9 D
  8. #     video_path: 视频文件路径, ]) {% T; k( N) e
  9. #     img_dir: 图片保存目录路径,路径不支持中文' }# F/ \' k* R  e
  10.     os.makedirs(img_dir,exist_ok=True)
    - a- E+ h8 V+ x
  11. #     img_dir:表示要创建的目录路径。5 R7 M8 Z& X/ u: i, P- m
  12. #     exist_ok=True:表示如果目录已经存在时不抛出异常。如果将 exist_ok 设置为 True,那么如果目录已经存在,os.makedirs() 函数也不会报错;如果设置为 False,则会抛出一个 FileExistsError 异常。% ?& f/ e1 N# M8 U5 ~! p6 r0 i
  13.     cv = cv2.VideoCapture(video_path)
    \" q# T: ]& P: l  ]4 h9 y/ ?3 [
  14.     frame_count = 0
    % Y9 s0 c) O) M- x
  15.     # 计数器) L1 z6 Z% B9 C5 M5 Q0 B
  16.     n = 0% `\" K7 x/ c8 i. s8 O. k/ V
  17.     # 命名计数器
    ( Y% _6 {4 i% _7 ^% R. R* N  ~
  18.     while True:
    ( k8 @8 Y, {4 @  ]  U
  19.         ret,frame = cv.read()\" U  Y  _/ ^, {% D& z8 N\" [# Y/ v
  20.         if not ret:
    - l$ U3 v) p0 c  l6 y
  21.             break
    \" ]3 D7 m2 Q; H$ v4 k3 t
  22.         frame_count += 1* ?\" Y' V7 o* {/ t
  23.         if frame_count % 30 ==0:
    1 [) }3 h: s4 l6 `
  24.             # 每隔三十帧获取一次图片
    # u! K5 D5 q, b+ C8 a
  25.             n += 1
    - g0 ]5 j- w/ K  A/ q- k5 q\" H
  26.             img_name = "0000000{0}.jpg".format(n)
    $ X- y+ }4 d2 y0 h9 N
  27.             img_file_path = os.path.join(img_dir,img_name); R$ D) r+ ~. |! q1 s\" \1 c: W, T
  28.             if not os.path.exists(img_file_path):
    - C# j/ _$ I7 G; N* B9 X
  29.                 sys.stdout.write("创建文件:"+ img_file_path + "\n")
      P1 H\" P; E% F5 a$ L  \; h
  30.                 # 标准输出流,将指定文本输出到控制台或其他输出设备中
    $ [\" Q\" e$ |; j& T# C5 ]% R  O
  31.                 cv2.imwrite(img_file_path,frame,[cv2.IMWRITE_JPEG_QUALITY,100])
    0 X7 y7 x. d\" }3 L1 M\" s
  32.                 # 将图像帧保存为jepg格式的图像,质量最高为100
    4 p6 L6 T7 B- f6 u/ @. |# a6 c
  33.             else:
    0 @\" t! ^/ V; t. `3 w2 ]& U) D7 ~2 Z
  34.                 sys.stderr.write("跳过:" + img_file_path + "\n")$ Y5 B0 H, {: {, }\" m
  35.                 ret,frame = cv.read()
      G* u3 y2 w7 K' T5 I9 F' m3 d

  36. 1 C* c% H7 t1 t/ K( \
  37. def run(video_dir,img_dir):% O- X5 y# O3 ]* ^& ?  T
  38.     pool = ThreadPoolExecutor()
    : Z\" L# ~+ B* y+ c; d( z9 K# t
  39.     # 创建一个线程池对象,实例化ThreadPoolExecutor类,将任务提交给线程池,线程池会自动调度线程来执行这些任务% \2 @5 D7 }) p: F$ w
  40.     for file in os.listdir(video_dir):
    1 X2 Q* v& |\" j; x# M  k1 {! ]6 g
  41.         if file[-4:] == ".mp4":
    , |) e( R4 L5 ?/ i5 B9 b
  42.             video_file_path = os.path.join(video_dir,file)
    ( I9 C. Y( m$ {+ _; I& G/ Y& I; h
  43.             img_dir_name = os.path.join(img_dir,file[:-4])* x/ Y( c& d. v
  44.             os.makedirs(img_dir_name,exist_ok=True)  J9 z% I\" C( l\" g& J  m( Z
  45.             pool.submit(output_img,*(video_file_path,img_dir_name)): D2 @2 O\" Y( d1 n
  46. #* 和 ** 是用于解包参数的操作符。在这种情况下,*(video_file_path, img_dir_name)' A  c( B+ E! R7 }* B
  47. # 的作用是将元组 (video_file_path, img_dir_name) 中的元素解包并作为单独的参数传递给函数。( [! \7 O8 f7 ~6 Q9 E+ R- C, A
  48. , ?6 D% `( C9 U  }+ Y4 a* h) f
  49. if __name__ == '__main__':. d5 ]. U4 b) w) e3 Q6 u- ~8 p
  50.     run(r"E:\video",r"E:\image")4 k3 z% I! E6 r  m- g$ a1 @
复制代码
! P# s3 Q) |" Q$ w9 e( z
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-7-10 06:42 , Processed in 0.739378 second(s), 51 queries .

回顶部