实验4-Yolov5物体检测
实验步骤:
- 需安装python3、opencv、conda环境。(如已安装可略过、可参考实验1-3的环境安装流程)
- 克隆YOLOv5模型,终端输入指令:git clone https://github.com/ultralytics/yolov5

3.cp -r /home/sunrise/yolov5 /home/sunrise/OPENCV/ #将yolov5文件包拷贝到功能包中保存
cd OPENCV
pip install -r /home/sunrise/OPENCV/requirements_yolov5_torch.txt(安装 YOLOv5 运行的最小依赖)

4.source rdkx5_vision_env/bin/activate #激活虚拟环境
5.安装关联包:
在OPENCV目录下
先升级 pip:python -m pip install --upgrade pip
运行以下命令:
pip install torch torchvision --extra-index-url [https://download.pytorch.org/whl/cpu](https://download.pytorch.org/whl/cpu))
pip install ultralyticspip install pandas psutil thop scipypython -m
pip install tqdm后续可能用到,建议一起安装:python -m pip install pandas psutil thop pillow pyyaml requests matplotlib seaborn
(以下步骤可先忽略,先尝试运行示例文件,如若版本依赖过低导致无法运行模型再进行更新:
升级基础安装工具:python -m pip install -U pip wheel setuptools==70.0.0
安装/升级缺失依赖:python -m pip install -U gitpython pillow==10.3.0
)
cd yolov5#进入文件包python detect.py --weights yolov5s.pt --source 0#运行摄像头版示例文件,需确保摄像头正常连接
终端打印如下:


如若无摄像头,可选择本地图片或视频导入:
- 使用本地图片快速验证
- python detect.py --weights yolov5s.pt --source path\to\image.jpg #source后修改为图片路径
使用视频文件验证
python detect.py --weights yolov5s.pt --source path\to\video.mp4#source后修改为视频路径
#!/usr/bin/env python3
"""
RDK X5 MediaPipe手势识别示例程序
适用于地瓜派RDK X5开发板的视觉开发
"""
import cv2
import mediapipe as mp
import numpy as np
import time
import math
class MediaPipeGestureRecognizer:
def __init__(self, camera_id=0, min_detection_confidence=0.7, min_tracking_confidence=0.5):
"""
初始化MediaPipe手势识别器
Args:
camera_id: 摄像头ID
min_detection_confidence: 最小检测置信度
min_tracking_confidence: 最小跟踪置信度
"""
# 初始化MediaPipe
self.mp_hands = mp.solutions.hands
self.mp_drawing = mp.solutions.drawing_utils
self.mp_drawing_styles = mp.solutions.drawing_styles
# 配置手部检测
self.hands = self.mp_hands.Hands(
static_image_mode=False,
max_num_hands=2,
min_detection_confidence=min_detection_confidence,
min_tracking_confidence=min_tracking_confidence
)
# 初始化摄像头
self.cap = cv2.VideoCapture(camera_id)
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
self.cap.set(cv2.CAP_PROP_FPS, 30)
# 性能监控
self.fps_counter = 0
self.fps_start_time = time.time()
self.current_fps = 0
def calculate_distance(self, point1, point2):
"""计算两点之间的距离"""
return math.sqrt((point1.x - point2.x)**2 + (point1.y - point2.y)**2)
def count_fingers(self, landmarks):
"""
计算伸出的手指数量
Args:
landmarks: 手部关键点
Returns:
int: 伸出的手指数量
"""
# 手指关键点ID
finger_tips = [4, 8, 12, 16, 20] # 拇指、食指、中指、无名指、小指
finger_pips = [3, 6, 10, 14, 18] # 对应的PIP关节
fingers_up = 0
# 检查拇指(特殊处理,因为拇指的方向不同)
if landmarks[finger_tips[0]].x > landmarks[finger_pips[0]].x:
fingers_up += 1
# 检查其他四个手指
for i in range(1, 5):
if landmarks[finger_tips[i]].y < landmarks[finger_pips[i]].y:
fingers_up += 1
return fingers_up
def detect_gesture(self, landmarks):
"""
检测手势类型
Args:
landmarks: 手部关键点
Returns:
str: 手势名称
"""
fingers_count = self.count_fingers(landmarks)
# 基本数字手势(英文)
if fingers_count == 0:
return "Fist"
elif fingers_count == 1:
return "One"
elif fingers_count == 2:
return "Two"
elif fingers_count == 3:
return "Three"
elif fingers_count == 4:
return "Four"
elif fingers_count == 5:
return "Five"
# 可以添加更复杂的手势识别逻辑
# 例如:OK手势、点赞手势等
return f"Unknown ({fingers_count} fingers)"
def detect_ok_gesture(self, landmarks):
"""检测OK手势"""
# 拇指尖和食指尖的距离
thumb_tip = landmarks[4]
index_tip = landmarks[8]
distance = self.calculate_distance(thumb_tip, index_tip)
# 如果拇指和食指很接近,可能是OK手势
if distance < 0.05:
return True
return False
def detect_thumbs_up(self, landmarks):
"""检测点赞手势"""
# 拇指向上,其他手指弯曲
thumb_tip = landmarks[4]
thumb_mcp = landmarks[2]
# 检查拇指是否向上
if thumb_tip.y < thumb_mcp.y:
# 检查其他手指是否弯曲
fingers_down = 0
finger_tips = [8, 12, 16, 20]
finger_pips = [6, 10, 14, 18]
for i in range(4):
if landmarks[finger_tips[i]].y > landmarks[finger_pips[i]].y:
fingers_down += 1
if fingers_down >= 3:
return True
return False
def update_fps(self):
"""更新FPS计算"""
self.fps_counter += 1
if self.fps_counter >= 30:
end_time = time.time()
self.current_fps = 30 / (end_time - self.fps_start_time)
self.fps_counter = 0
self.fps_start_time = end_time
def draw_info(self, image, gesture_text, hand_count):
"""在图像上绘制信息"""
# 根据图像大小调整信息框大小
height, width = image.shape[:2]
info_width = min(500, width - 20)
info_height = 140
# 绘制背景矩形
cv2.rectangle(image, (10, 10), (10 + info_width, 10 + info_height), (0, 0, 0), -1)
# 根据图像大小调整字体大小
font_scale = max(0.8, width / 800)
thickness = max(2, int(width / 400))
# 绘制文本信息(英文)
cv2.putText(image, f"FPS: {self.current_fps:.1f}", (20, 45),
cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 255, 0), thickness)
cv2.putText(image, f"Hands Detected: {hand_count}", (20, 85),
cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 255, 0), thickness)
cv2.putText(image, f"Gesture: {gesture_text}", (20, 125),
cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 255, 255), thickness)
def run(self):
"""运行手势识别主循环"""
print("RDK X5 MediaPipe手势识别启动...")
print("按 'q' 键退出程序")
# 创建窗口(只创建一次)
cv2.namedWindow('RDK X5 Gesture Recognition', cv2.WINDOW_NORMAL)
cv2.resizeWindow('RDK X5 Gesture Recognition', 1280, 720)
while True:
ret, frame = self.cap.read()
if not ret:
print("无法读取摄像头数据")
break
# 翻转图像(镜像效果)
frame = cv2.flip(frame, 1)
# 转换颜色空间
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 处理图像
results = self.hands.process(rgb_frame)
gesture_text = "No Gesture"
hand_count = 0
# 如果检测到手部
if results.multi_hand_landmarks:
hand_count = len(results.multi_hand_landmarks)
for hand_landmarks in results.multi_hand_landmarks:
# 绘制手部关键点
self.mp_drawing.draw_landmarks(
frame,
hand_landmarks,
self.mp_hands.HAND_CONNECTIONS,
self.mp_drawing_styles.get_default_hand_landmarks_style(),
self.mp_drawing_styles.get_default_hand_connections_style()
)
# 识别手势
gesture_text = self.detect_gesture(hand_landmarks.landmark)
# 检测特殊手势
if self.detect_ok_gesture(hand_landmarks.landmark):
gesture_text = "OK Gesture"
elif self.detect_thumbs_up(hand_landmarks.landmark):
gesture_text = "Thumbs Up"
# 更新FPS
self.update_fps()
# 绘制信息
self.draw_info(frame, gesture_text, hand_count)
# 显示结果(只更新图像内容)
cv2.imshow('RDK X5 Gesture Recognition', frame)
# 检查退出条件
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 清理资源
self.cap.release()
cv2.destroyAllWindows()
print("程序已退出")
def main():
"""主函数"""
try:
# 创建手势识别器
recognizer = MediaPipeGestureRecognizer(
camera_id=0,
min_detection_confidence=0.7,
min_tracking_confidence=0.5
)
# 运行识别程序
recognizer.run()
except Exception as e:
print(f"程序运行出错: {e}")
print("请检查:")
print("1. 摄像头是否正确连接")
print("2. MediaPipe是否正确安装")
print("3. OpenCV是否正确安装")
if __name__ == "__main__":
main()