XZNSH-Code-AI/Bank_second_part/dataset_deal/video_model.py

180 lines
4.2 KiB
Python

import numpy as np
import cv2
import os
import time
from tqdm import tqdm
from ultralytics import YOLO
from ultralytics.yolo.utils.plotting import Annotator
from yolov8_det import analysis_yolov8
model_yolo = YOLO("E:/Bank_files/Bank_02/model_files/all_labels.pt")
# 图像文件夹
def get_video_list(path):
video_ext = [".mp4", ".avi",".MP4"]
video_names = []
for maindir, subdir, file_name_list in os.walk(path):
for filename in file_name_list:
apath = os.path.join(maindir, filename)
ext = os.path.splitext(apath)[1]
if ext in video_ext:
video_names.append(apath)
return video_names
# 截取裁剪需要的视频帧
def save_seg_video(video_name,frameToStart,frametoStop,videoWriter,bbox):
cap = cv2.VideoCapture(video_name)
count = 0
while True:
success, frame = cap.read()
if success:
count += 1
if count <= frametoStop and count > frameToStart: # 选取起始帧
print('correct= ', count)
#裁剪视频画面
frame_target = frame[int(bbox[1]):int(bbox[3]), int(bbox[0]):int(bbox[2])] # (split_height, split_width)
videoWriter.write(frame_target)
if not success or count >= frametoStop:
break
print('end')
# 对视频的操作
def get_seg_video(video_file,video_save_path,dertTime):
# 检查路径
print("frame image save path{}".format(video_save_path))
os.makedirs(video_save_path, exist_ok=True)
if os.path.isdir(video_file):
files = get_video_list(video_file)
else:
files = [video_file]
files.sort()
video_num = len(files)
for num in range(video_num):
# 视频名字
video_name = files[num]
print(video_name)
video_basename = os.path.basename(video_name).split('.')[0]
cap = cv2.VideoCapture(video_name)
#帧率
fps = cap.get(cv2.CAP_PROP_FPS)
success,frame = cap.read()
count_fps = 0
write_fps = 0
dertTime = 2
# 每段帧率
dertF = dertTime * fps
# while True:
# 前后帧信息保存
# result_list = []
# count_result_num = 0
while success:
count_fps += 1
# 调用模型,逐帧检测
results_img = analysis_yolov8(frame=frame,
model_coco=model_yolo,
confidence=0.1)
# result_list.append({count_fps:results_img})
# if len(result_list) == 5:
# result_list.clear()
# num = len(results_img)
# # 如果只检测到一个人
if num == 1:
# 起始帧
write_fps = count_fps
stop_fps = write_fps + dertF
# 目标检测结果
bbox = list(results_img[0].values())[0]
w = bbox[2] -bbox[0]
h = bbox[3] -bbox[1]
size = [int(w),int(h)]
# 保存截取视频
video_name_save = video_save_path + '/' + video_basename + '_' +str(write_fps) + '.avi'
videoWriter =cv2.VideoWriter(video_name_save,cv2.VideoWriter_fourcc('X','V','I','D'),fps,size)
save_seg_video(video_name,write_fps,stop_fps,videoWriter,bbox)
# result_dict = {count_fps:bbox}
# result_list.append(result_dict)
# print(count_fps,write_fps,stop_fps,video_name,bbox)
break
# if num == 0:
# continue
# if num > 1:
# # print()
# pass
if __name__ == '__main__':
# 每个视频的时长(单位秒)
dertTime = 5
video = "E:/Bank_files/Bank_02/dataset/vlc_0711/0711-1.mp4"
video_save = 'videos_codes_2'
get_seg_video(video_file=video,video_save_path=video_save,dertTime=dertTime)