当前位置:   article > 正文

Python从多个视频中根据帧或者时间截取图片(详细备注版)Opencv_python cv2读取视频流截取图片,第一次跟第二次截取的不一样

python cv2读取视频流截取图片,第一次跟第二次截取的不一样

已有多个从视频中读取的CSV,CSV记录了帧数。
前两部分:将‘两类’多个CSV合并生成新的表格,记录帧数-原视频以及所在文件夹。
后两部分:根据CSV中Frame ID,提取视频中对应的图片

第一部分将多个CSV合并

 files_2d = []
 for i in range(1, 16):
     files = glob.glob(f'/这里是你的路径,后面VP代表视频所在的文件夹/vp{i}/*.ids_1.openpose.2d.csv', 
                    recursive = False)
     files.sort()
     files_2d.extend(files)
 files_2d  #输出结果
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
 list_2d= []
 list_3d= []


 for filename in files_2d:
     df_2d = pd.read_csv(filename, index_col=None, header=0)[columns_list_2d]
     df_2d.insert(0, 'participant', os.path.basename(Path(filename).parent))
     df_2d.insert(1, 'filename', os.path.basename(filename))
     df_2d.insert(2, '2d', True)
     list_2d.append(df_2d)

     filename_3d = filename[:-6] + '3d.csv'
     df_3d = pd.read_csv(filename_3d, index_col=None, header=0)[columns_list_3d]
     df_3d.insert(0, 'participant', os.path.basename(Path(filename_3d).parent))
     df_3d.insert(1, 'filename', os.path.basename(filename_3d))
     df_3d.insert(2, '2d', False)
     list_3d.append(df_3d)

 key_points_2d = pd.concat(list_2d, axis=0, ignore_index=True)
 key_points_3d = pd.concat(list_3d, axis=0, ignore_index=True)

 key_points_2d.to_csv('/这里是你的路径/all_2d_annotations.csv', index=False)
 key_points_3d.to_csv('/这里是你的路径/all_3d_annotations.csv', index=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
key_points_2d_path = '../all_2d_annotations.csv'
key_points_3d_path = '../all_3d_annotations.csv'
  • 1
  • 2
key_points_2d = pd.read_csv(key_points_2d_path, index_col=None, header=0)
key_points_2d  #输出2d图
  • 1
  • 2
 key_points_3d = pd.read_csv(key_points_3d_path)
key_points_3d #输出3D图
  • 1
  • 2

第二步从某个特定的FrameID(在汇总的Frame id)转化为针对某个特定视频的Frame id

import numpy as np
import os
Var1 = "VP10"             #这一行不需要,只是分段编辑的时候实验用
Frame_id = 100000         #这个代表从总的CSV中想要读的Frame id
Number_Video = Var1[2:]   #我的视频文件夹为VP1到VP15,这里去掉前两位,取后面数字,用于之后拼接路径
print(Number_Video)

#find Video Path拼接路径
Path = os.path.join('/home/KIT/SS 2022/CV Praktikum/Dataset/Annotations/2d_3d_annotations/vp' + Number_Video)


#假如视频frame id 为100000,视频文件夹为5.只需要用frame id减去之前4个文件夹的总帧数,就得到了在5视频下需要提取图片的帧数。C:想从文件夹5中提取的第c帧图片
Int_Number = int(Number_Video)

#Get Frame Id 
if Int_Number > 1:
    cap = cv2.VideoCapture(Path) 
    cap.get(7)
    Frame_id = Frame_id - cap.get(7)
    Int_Number -=1 
else:
    c = Int_Number 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

第三步:提取对应帧数图片

####Pick out Image from the Video relate to frame id --- c


import cv2
import os

cap = cv2.VideoCapture(Path)    #Path of Video
FPS = cap.get(5)                                                           #get Frame of Image
c = 10000                                                                  #Frame ID

start = 0
Videolong = cap.get(7)                                                     
print('Total Frame   ' + str(Videolong))                                      #Total Frame of the Video

output =r'/home/tmac/Workingdisc/CVHCI/image/'                             #Path of Output/Image

while (True):
    ret, frame = cap.read()                                                
 
    if start <= c <= Videolong :                                                    
            
            Output_name = output + str(c)

            print("Getting Image:  " + str(c))
            print(frame.shape)
            
            cv2.imwrite(Output_name + '.jpg', frame)                                
            #cv2.imshow('Output_name',frame)
            #cv2.waitKey(0)
            break
    if c>Videolong:
            print('Out of limit')
            break

cap.release()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

第四步:提取某个特定视频的某个时间段的图片,每间隔100帧取一个图

######Pick out Image between st(starttime) until ed(endtime), 
import cv2
import os
 
cap = cv2.VideoCapture(r"/home/tmac/Workingdisc/CVHCI/image/run1b.mp4")                    #Path of Video
FPS = cap.get(5)
c = 1

#time & Frame ID
st = '20.15'                                                                               #Starttime
ed = '20.55'                                                                               #Endtime
start = int(st.split('.')[0]) * 60 + int(st.split('.')[1])                                 #Startframe
end = int(ed.split('.')[0]) * 60 + int(ed.split('.')[1])                                   #Endframe


#Time to Frame
startframe = int(FPS) * start  
endframe = int(FPS) * end

#Output Path
output = r'/home/tmac/Workingdisc/CVHCI/image/'.format(st,ed)
if not os.path.exists(output):
    os.makedirs(output)



while (True):
    ret, frame = cap.read()
    if ret:
        if startframe<= c <= endframe and c%100==0:                     #get Images each 100 frame
            print("Clipping:" + str(c) + " th Frame")

            cv2.imwrite(output + str(c) + '.jpg', frame)                # Save Image

        if c>endframe:
            print('Get all Images')
            break
        c += 1
    else:
        print("No Video exists")
        break
cap.release()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/649191
推荐阅读
相关标签
  

闽ICP备14008679号