树莓派小车移动追踪代码position_x未定义报错及罗技C270摄像头适配问题
报错及兼容性问题解决方案
1. 'position_x' is not defined 报错修复
报错原因
你的代码存在缩进错误:check_for_direction 函数定义结束后,所有和position_x判断相关的代码没有缩进进函数内部,作为全局代码直接运行,而全局作用域里并没有定义position_x变量,因此启动时直接触发未定义报错。
同时代码中还有两处额外错误:
- 代码中
<、>是HTML转义字符,需要替换为Python语法的<、> camera = PiCamera()缩进错误,缩进到了前面的else分支内部,会导致全局作用域找不到camera变量
修复方法
把check_for_direction函数修改为如下格式:
def check_for_direction(position_x): GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) GPIO.setup(11,GPIO.OUT) GPIO.setup(12,GPIO.OUT) GPIO.setup(15,GPIO.OUT) GPIO.setup(16,GPIO.OUT) GPIO.setup(38,GPIO.OUT) if position_x == 0 or position_x == width: print( 'out of bound') t_stop() if position_x <= ((width-tracking_width)/2 - tracking_width): print ('move right!') t_right() elif position_x >= ((width-tracking_width)/2 + tracking_width): print('move left!') t_left() else: # print 'move front' t_up()
然后把camera = PiCamera() 这行的缩进删除,和后面的camera.resolution代码对齐即可。
2. 罗技C270兼容性说明
不兼容点
你当前代码使用的picamera库仅支持树莓派官方CSI接口摄像头,罗技C270是USB网络摄像头,无法通过picamera库驱动,必须替换摄像头读取逻辑。
适配方法
首先删除代码中所有和picamera相关的导入、初始化代码,替换为OpenCV的USB摄像头读取逻辑:
- 替换导入部分:删除
from picamera.array import PiRGBArray、from picamera import PiCamera两行 - 替换摄像头初始化部分:
# 替换原来的camera初始化、rawCapture相关所有代码 cap = cv2.VideoCapture(0) # 设备号如果识别失败可以尝试改为1、2 cap.set(cv2.CAP_PROP_FRAME_WIDTH, width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) # 摄像头预热 time.sleep(0.1)
- 替换帧读取逻辑:把原来的帧读取循环、首帧ROI捕获逻辑修改为如下格式,原有颜色追踪、小车控制逻辑无需改动:
# 读取第一帧设置ROI ret, frame = cap.read() if not ret: print("摄像头读取失败") exit() # 原有ROI、直方图计算逻辑适配,把rawCapture2.array替换为frame即可 c,r,w,h = (width/2 - tracking_width/2), (height/2 - tracking_height/2), tracking_width, tracking_height track_window = (c,r,w,h) roi = frame[r:r+h, c:c+w] hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv_roi, np.array([0,30,32]), np.array([180,255,255])) roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0,180]) cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX) term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 80, 1) # 主循环替换 while True: ret, frame = cap.read() if not ret: break image = frame hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) dst = cv2.calcBackProject([hsv], [0], roi_hist, [0,180], 1) ret, track_window = cv2.meanShift(dst, track_window, term_crit) x,y,w,h = track_window cv2.rectangle(image, (x,y), (x+w,y+h), 255, 2) cv2.putText(image, 'Tracked', (x-25, y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) cv2.imshow("Raspberry Pi RC Car", image) key = cv2.waitKey(1) & 0xFF if key == ord('q'): break check_for_direction(x) time.sleep(0.01) # 释放资源 cap.release() cv2.destroyAllWindows()
罗技C270是标准UVC摄像头,树莓派系统默认集成驱动,修改后可正常运行。
内容的提问来源于stack exchange,提问作者方耀廷
相关产品推荐
相关产品推荐

