使用此代码运行完全部视频后TAR文件夹中只存了五张图片,远少于实际目标数量
import time
import cv2
from ultralytics import YOLO
from ultralytics.utils.plotting import save_one_box as crop
import imutils
import numpy as np
import os
import shutil
model = YOLO('best.pt')
video_path = "D:/WIN_20230907_21_08_23_Pro.mp4"
cap = cv2.VideoCapture(video_path)
confi = 0.2
if not os.path.exists('TAR'):
os.mkdir('TAR')
while cap.isOpened():
success, frame = cap.read()
confi = round(confi, 2)
if confi <= 0.2:
confi = 0.2
elif confi >= 0.8:
confi = 0.8
if success:
Results = model(frame, conf=confi, save=False, show=False)
annotated_frame = Results[0].plot()
cv2.imshow("YOLOv8 Tracking", annotated_frame)
r = Results[0]
ori_h, ori_w = r.orig_shape
if Results:
obbs = r.obb.xywhr.tolist()
for i, obb in enumerate(obbs):
xc, yc, w, h, angle = obb
print(xc, yc, w, h, angle)
roM = cv2.getRotationMatrix2D((xc, yc), angle, 1)
ro_frame = cv2.warpAffine(frame, roM, (ori_w, ori_h))
cropped_frame = cv2.getRectSubPix(ro_frame, (int(w), int(h)), (xc, yc))
filename = f"TAR/cropped_{i}.jpg"
cv2.imwrite(filename, cropped_frame)
else:
bkg = np.ones((256, 1280, 3), dtype=np.uint8)
bkg *= 200
annotated_frame = np.vstack((annotated_frame, bkg))
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()