import cv2
import math
import time
from ultralytics import YOLO
# from PIL import Image, ImageDraw, ImageFontq
# import numpy as np
# 한글 폰트
# font_path = "C:/Windows/Fonts/malgun.ttf" # 사용하려는 한글 폰트 경로
# font_size = 10
# font = ImageFont.truetype(font_path, font_size)
model = YOLO("../YOLO_Model/v11/yolo11n.pt") # 모델 로드
cap = cv2.VideoCapture("Test_Videos/bicycle.mp4") # 동영상 파일 사용
#cap = cv2.VideoCapture(0) # 웹캠 사용
# 코코데이터 셋 클래스 이름
cocoClassEnNames = ["person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck", "boat",
"traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog",
"horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella",
"handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite",
"baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle",
"wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange",
"broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "sofa", "pottedplant", "bed",
"diningtable", "toilet", "tvmonitor", "laptop", "mouse", "remote", "keyboard", "cell phone",
"microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors",
"teddy bear", "hair drier", "toothbrush"]
cocoClassKoNames = ["사람", "자전거", "자동차", "오토바이", "비행기", "버스", "기차", "트럭", "보트",
"신호등", "소화전", "정지 표지판", "주차 미터기", "벤치", "새", "고양이", "개",
"말", "양", "소", "코끼리", "곰", "얼룩말", "기린", "배낭", "우산",
"핸드백", "넥타이", "가방", "프리즈비", "스키", "스노보드", "스포츠 공", "카이트",
"야구 배트", "야구 글러브", "스케이트보드", "서핑보드", "테니스 라켓", "병",
"와인잔", "컵", "포크", "나이프", "숟가락", "그릇", "바나나", "사과", "샌드위치", "오렌지",
"브로콜리", "당근", "핫도그", "피자", "도넛", "케이크", "의자", "소파", "화장실", "TV 모니터", "노트북", "마우스", "리모컨", "키보드", "휴대전화",
"전자레인지", "오븐", "토스터", "싱크대", "냉장고", "책", "시계", "꽃병", "가위",
"테디베어", "헤어드라이어", "칫솔"]
ptime = 0
ctime = 0
while True:
ret, frame = cap.read()
if ret:
results = model(frame, conf=0.25, save=False) # 모델로 프레임 예측
for result in results:
boxes = result.boxes # 바운딩 박스 좌표
for box in boxes:
x1, y1, x2, y2 = box.xyxy[0] # 바운딩 박스 좌표
#print(f"x1: {x1}, y1: {y1}, x2: {x2}, y2: {y2}")
# 텐서 값을 정수로 변환
x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
print(f"x1: {x1}, y1: {y1}, x2: {x2}, y2: {y2}")
cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2) # 바운딩 박스 그리기
classNameInt = int(box.cls[0]) # 클래스 번호
classname = cocoClassEnNames[classNameInt] # 클래스 이름
conf = math.ceil(box.conf[0] * 100)/100 # 신뢰도
label = classname + ":" + str(conf) # 라벨
text_size = cv2.getTextSize(label, 0, fontScale=0.5, thickness=2)[0] # 텍스트 사이즈
c2 = x1 + text_size[0], y1 - text_size[1] - 3 # 텍스트 위치
cv2.rectangle(frame, (x1, y1), c2, (255, 0, 0), -1) # 박스 그리기
cv2.putText(frame, label, (x1, y1 - 2), 0, 0.5, (255, 255, 255), thickness=1, lineType=cv2.LINE_AA) # 텍스트 출력
##########################
# 한글 처리
##########################
# pil_image = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
# draw = ImageDraw.Draw(pil_image)
# # 텍스트 위치와 색상 설정
# text_position = (x1 + 10, y1 - 12)
# text_color = (255, 255, 255) # 흰색
# # 텍스트 그리기
# draw.text(text_position, label, font=font, fill=text_color)
# # PIL 이미지를 다시 OpenCV 형식으로 변환
# frame_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
# OpenCV를 이용해서 화면 출력
ctime = time.time() # 현재 시간
fps = 1/(ctime - ptime) # FPS 계산
ptime = ctime # 이전 시간
cv2.putText(frame, "FPS" + ":" + str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)
cv2.imshow("Video", frame)
if cv2.waitKey(1) & 0xFF == ord('q'): # q를 누르면 종료
break
else:
break
cap.release()
cv2.destroyAllWindows()