import os
import cv2
import numpy as np
from ultralytics import YOLO
from PIL import Image

# # 加载yolo实例分割模型
# model = YOLO('yolov8n-seg.yaml')
# model = YOLO('yolov8n-seg.pt')
# 加载yolo目标检测模型
model = YOLO('yolov8n.yaml')
model = YOLO('yolov8n.pt')
# 初始化摄像头设备
cap = cv2.VideoCapture(0)
# 获取帧率
fps = cap.get(cv2.CAP_PROP_FPS)
print("帧率:",fps)

sum = 0
frameNum = 2 # 抽帧间隔

while(cap.isOpened()):
sum += 1
# 读帧
ret, frame = cap.read()
if ret == True and (sum % frameNum == 0):
# cv2读取的图片是bgr格式,将图像转化为rgb格式
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 转化成image数组
img = Image.fromarray(np.uint8(rgb))
# 转化为numpy数组
img = np.array(img)

# yolo算法接受的图像输入源有PIL、np.ndarray、image、video、screenshot、directory \
# list of images、list of streams、glob、 YouTube、RTSP, RTMP, HTTP stream
# 预测图像
results = model.predict(img)
for i in results[0].boxes:
# print('result:',i.data.tolist()[0])
# print('conf:',i.conf)
# print('cls:',i.cls)
# 将坐标点转化为list,data包含xyxy坐标、置信度、类值
coor = i.data.tolist()[0]
for index, j in enumerate(coor):
if index != 4:
coor[index] = int(j)
# conf = i.conf.tolist()[0]
# 在图片上绘制矩形框
# rectangl参数(图片,(x1,y1),(x2,y2),(画框颜色),线条粗细)
# putText参数(图片,输出的文字,(x1,y1),字体,大小,颜色,字体粗细)
rgb = cv2.rectangle(img, (coor[0], coor[1]), (coor[2], coor[3]), (0,255,0), 2)
rgb = cv2.putText(img, 'conf:{:.2f}'.format(coor[4]), (coor[0], coor[1]-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 1)
# 将图片转化为bgr格式,加载到视频输出窗口
cv2.imshow('video', cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR))
# if sum == 2:
# break
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头
cap.release()
cv2.destroyAllWindows()