1.练习项目 :
练习使用Python语言
2.开始练习
(1)源码 :
import cv2
from ultralytics import YOLO
========== 配置参数 ==========
MODEL_PATH = 'yolo11n.pt'
CONFIDENCE_THRESHOLD = 0.5
焦距(像素)------ 基于你刚刚标定的结果
FOCAL_PERSON = 440 # 垂直焦距,用于行人(身高)
FOCAL_CAR = 444 # 水平焦距,用于车辆(车宽),保持你之前的标定
真实尺寸(米)
PERSON_HEIGHT = 1.70 # 行人身高
CAR_WIDTH = 1.80 # 车辆宽度
只检测的类别(person:0, car:2)
TARGET_CLASSES = {0, 2}
========== 工具函数 ==========
def compute_distance(real_size, focal, pixel_size):
if pixel_size <= 0:
return -1
return (real_size * focal) / pixel_size
========== 加载模型 ==========
model = YOLO(MODEL_PATH)
========== 打开摄像头 ==========
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
print("按 'q' 退出,按 's' 保存截图")
while True:
ret, frame = cap.read()
if not ret:
break
推理(只检测 person 和 car)
results = model(frame, verbose=False, classes=0, 2)
for r in results:
boxes = r.boxes
if boxes is None:
continue
for box in boxes:
conf = float(box.conf0)
if conf < CONFIDENCE_THRESHOLD:
continue
cls = int(box.cls0)
x1, y1, x2, y2 = box.xyxy0.tolist()
if cls == 0: # person
pixel_size = y2 - y1 # 高度(像素)
real_size = PERSON_HEIGHT
focal = FOCAL_PERSON
label_name = "Person"
elif cls == 2: # car
pixel_size = x2 - x1 # 宽度(像素)
real_size = CAR_WIDTH
focal = FOCAL_CAR
label_name = "Car"
else:
continue
distance = compute_distance(real_size, focal, pixel_size)
if distance < 0:
continue
绘制
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
text = f"{label_name} {conf:.2f} | {distance:.1f}m"
cv2.putText(frame, text, (int(x1), int(y1) - 5),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
cv2.imshow("YOLO Distance Measurement", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('s'):
cv2.imwrite("distance_screenshot.jpg", frame)
print("截图已保存")
cap.release()
cv2.destroyAllWindows()
(2)检验结果
对此代码进行检验,检验后无报错,运行此代码,运行结果正确。
(3)练习心得:
注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法 是否切换为英语模式;语法是否错误。