You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
4.2 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)