我之前写的思路 你可以借鉴 import cv2
import mediapipe as mp
import numpy as np
# 已知参数
focal_length = 500 # 假设的摄像头焦距(像素)
sensor_width = 3.6 # 假设的摄像头传感器宽度(毫米)
real_width = 0.16 # 假设的人脸宽度(米)
# 初始化MediaPipe的身体姿态估计模型
mp_pose = 网页链接 pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
# 初始化摄像头
cap = cv2.VideoCapture(0)
if __name__ == '__main__':
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 将图像转换为RGB
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 处理图像并找到身体姿态
results = pose.process(image)
# 绘制身体姿态标志
if results.pose_landmarks:
mp_draw = mp.solutions.drawing_utils
mp_draw.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
# 获取左右眼内侧标志的像素坐标
left_eye_inner_x = int(results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_EYE_INNER].x * frame.shape[1])
left_eye_inner_y = int(results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_EYE_INNER].y * frame.shape[0])
right_eye_outer_x = int(results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_EYE_OUTER].x * frame.shape[1])
right_eye_outer_y = int(results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_EYE_OUTER].y * frame.shape[0])
# 计算人脸宽度在图像中的像素数
face_width_pixels = right_eye_outer_x - left_eye_inner_x
# 使用相似三角形原理计算距离
distance = (focal_length * real_width) / (face_width_pixels * sensor_width)
# 在图像上绘制距离
cv2.putText(frame, f"Distance: {distance:.2f} m", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 2)
# 如果距离小于50厘米,则发出警报
if distance < 0.5:
cv2.putText(frame, "ALERT: Too close!", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 3)
# 显示结果
cv2.imshow('MediaPipe Pose', frame)
# 按'q'退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
import mediapipe as mp
import numpy as np
# 已知参数
focal_length = 500 # 假设的摄像头焦距(像素)
sensor_width = 3.6 # 假设的摄像头传感器宽度(毫米)
real_width = 0.16 # 假设的人脸宽度(米)
# 初始化MediaPipe的身体姿态估计模型
mp_pose = 网页链接 pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
# 初始化摄像头
cap = cv2.VideoCapture(0)
if __name__ == '__main__':
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 将图像转换为RGB
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 处理图像并找到身体姿态
results = pose.process(image)
# 绘制身体姿态标志
if results.pose_landmarks:
mp_draw = mp.solutions.drawing_utils
mp_draw.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
# 获取左右眼内侧标志的像素坐标
left_eye_inner_x = int(results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_EYE_INNER].x * frame.shape[1])
left_eye_inner_y = int(results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_EYE_INNER].y * frame.shape[0])
right_eye_outer_x = int(results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_EYE_OUTER].x * frame.shape[1])
right_eye_outer_y = int(results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_EYE_OUTER].y * frame.shape[0])
# 计算人脸宽度在图像中的像素数
face_width_pixels = right_eye_outer_x - left_eye_inner_x
# 使用相似三角形原理计算距离
distance = (focal_length * real_width) / (face_width_pixels * sensor_width)
# 在图像上绘制距离
cv2.putText(frame, f"Distance: {distance:.2f} m", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 2)
# 如果距离小于50厘米,则发出警报
if distance < 0.5:
cv2.putText(frame, "ALERT: Too close!", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 3)
# 显示结果
cv2.imshow('MediaPipe Pose', frame)
# 按'q'退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):