Python从多个视频中根据帧或者时间截取图片(详细备注版)Opencv

已有多个从视频中读取的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  #输出结果
 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)
key_points_2d_path = '../all_2d_annotations.csv'
key_points_3d_path = '../all_3d_annotations.csv'
key_points_2d = pd.read_csv(key_points_2d_path, index_col=None, header=0)
key_points_2d  #输出2d图
 key_points_3d = pd.read_csv(key_points_3d_path)
key_points_3d #输出3D图

第二步从某个特定的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 

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

####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()

第四步:提取某个特定视频的某个时间段的图片,每间隔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()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值