ROS Melodic中迁移OpenCV人体检测代码遇语法错误求助
问题解决方案:ROS Melodic(Python3.6)下YOLO代码语法错误
问题背景
在Ubuntu 22.04的Python3.10环境编写的OpenCV人体检测代码,迁移至Docker运行的ROS Melodic环境(Python3.6.9)时触发语法错误,错误信息如下:
错误信息
File "/ws/src/vision-car/scripts/yolo-cam.py", line 70 cvzone.putTextRect(img,f"{currentClass} {conf}",(max(0,x1),max(35,y1)),scale=2,thickness=2) ^ SyntaxError: invalid syntax
核心解决方案
1. 修复当前语法错误
虽然Python3.6官方支持f-string,但部分旧环境或依赖库可能存在兼容性问题。将报错行的f-string替换为Python3.6完全兼容的字符串格式化方式:
原代码:
cvzone.putTextRect(img,f"{currentClass} {conf}",(max(0,x1),max(35,y1)),scale=2,thickness=2)
修改为(二选一):
方式1:使用str.format()
cvzone.putTextRect(img,"{} {}".format(currentClass, conf),(max(0,x1),max(35,y1)),scale=2,thickness=2)
方式2:使用%格式化
cvzone.putTextRect(img,"%s %.2f" % (currentClass, conf),(max(0,x1),max(35,y1)),scale=2,thickness=2)
2. 解决YOLOv8的Python版本兼容问题
你使用的ultralytics YOLOv8要求Python3.7及以上,而ROS Melodic默认的Python3.6不满足该要求,后续会触发更多运行时错误,需二选一处理:
选项A:降级YOLO版本到YOLOv5
YOLOv5支持Python3.6+,修改代码适配YOLOv5的API:
- 将
from ultralytics import YOLO替换为from yolov5 import YOLO(或直接使用YOLOv5的官方代码结构) - 调整检测结果的解析逻辑(YOLOv5的结果格式与YOLOv8略有不同)
选项B:在Docker中配置Python3.7+环境
在Dockerfile中指定Python3.7版本,并兼容ROS Melodic:
FROM ros:melodic # 安装Python3.7及依赖 RUN apt-get update && apt-get install -y software-properties-common RUN add-apt-repository ppa:deadsnakes/ppa && apt-get update RUN apt-get install -y python3.7 python3.7-dev python3-pip # 设置Python3.7为默认 RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2 # 安装所需库 RUN python3 -m pip install opencv-python cvzone ultralytics
额外使用建议
- ROS Python版本规范:将脚本开头的
#!/usr/bin/env python改为#!/usr/bin/env python3,确保使用Python3环境运行;所有依赖用pip3 install安装。 - ROS节点优化:当前代码的
while True循环未结合ROS的生命周期管理,会导致CPU占用过高,修改为:while not rospy.is_shutdown(): # 原有的图像读取、检测逻辑 rate.sleep() - Docker摄像头权限:运行容器时需添加设备映射并赋予权限:
docker run --device=/dev/video0:/dev/video0 --privileged -it your-image-name - 依赖版本锁定:在
requirements.txt中明确指定依赖版本,避免环境差异导致问题,例如:opencv-python==4.5.5.62 cvzone==1.5.6 ultralytics==7.0.0 # 仅当使用Python3.7+时 yolov5==7.0.13 # 若降级到YOLOv5
内容的提问来源于stack exchange,提问作者MikeyFlores
相关产品推荐
相关产品推荐

