一、使用yolov10模型检测视频中出现的行人,并保存为图片,detect_person.py代码如下:
from ultralytics import YOLOv10
import glob
import os
import cv2
import argparse
def detect_person(videoPath, savePath):
if not os.path.exists(savePath):
os.mkdir(savePath)
# YOLOV10模型路径
modelpath = r'q:\yolov10-main\weights\yolov10m.pt'
print("------------------",videoPath,savePath)
model = YOLOv10(modelpath)
timeF = 0
image_count = 0
# filenames = glob.glob(os.path.join(videoPath, '*.avi'))
# 遍历视频文件夹
for root, dirs, files in os.walk(videoPath):
print("======",root)
print("++++++",dirs)
print("------",files,len(files))
# 遍历视频文件
for filename in files:
# if(not filename.endswith(".avi")):
# continue
if(filename.split('.')[-1] not in ['avi','mp4']):
continue
img = 1
videofile = os.path.join(root, filename)
video = cv2.VideoCapture(videofile)
frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
# 遍历视频每一帧
for _ in range(frames):
ret, frame = video.read()
timeF += 1
if ret:
results = model.predict(frame)[0]
personcount = 0
for box in results.boxes:
if box.cls == 0 and box.conf > 0.5:
personcount += 1
# 图片中出现大于2人,且间隔15帧,保存图片
if personcount >= 2 and timeF > 15 :
cv2.imwrite(os.path.join(savePath, filename.split('\\')[-1][:-4] + '_' + str(img) + '.jpg'),frame)
if image_count % 100 == 0:
print("image_count : ",image_count)
timeF = 0
img += 1
# 释放资源
video.release()
# 删除视频源文件,不想删除可以注释掉
os.remove(videofile)
if __name__ == '__main__':
parse = argparse.ArgumentParser(description='使用yolov10模型检测视频中出现的行人,并保存为图片')
parse.add_argument('--videoDir',required=True,help='视频文件夹')
parse.add_argument('--imageDir',required=True,help='保存图片文件夹')
args = parse.parse_args()
detect_person(args.videoDir, args.imageDir)
二、在终端执行以上代码的命令
python.exe detect_person.py --videoDir Q:\DATAS\adas-data\video-person\20250708 --imageDir Q:\DATAS\adas-data\video-person\images-20250718