终端运行树莓派Python人脸识别程序报错:无法读取trainer.yml文件求助
问题根源:工作目录差异导致相对路径失效
你遇到的File can't be opened for reading!错误,本质是终端运行脚本时的工作目录和Thonny里的不一样:
- Thonny默认会把工作目录设置为你打开的脚本所在的文件夹(也就是
/home/pi/Cascades2/),所以trainer/trainer.yml这个相对路径能正确指向/home/pi/Cascades2/trainer/trainer.yml。 - 但终端默认的工作目录是你的用户主目录
/home/pi/,这时候脚本里的相对路径会去找/home/pi/trainer/trainer.yml,自然找不到文件。
两种解决方法
方法1:先切换到脚本目录再运行
在终端里先进入脚本所在的文件夹,再执行程序:
cd /home/pi/Cascades2 python3 03_face_recognition.py
方法2:修改代码使用绝对路径(推荐)
把代码里的相对路径改成基于脚本自身位置的绝对路径,这样不管从哪个目录运行都不会出错:
修改读取trainer.yml和分类器的部分代码:
import cv2 import numpy as np import os import time import datetime import RPi.GPIO as GPIO # 获取当前脚本所在的绝对目录 script_dir = os.path.dirname(os.path.abspath(__file__)) relay = 23 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(relay, GPIO.OUT) GPIO.output(relay, 0) recognizer = cv2.face.LBPHFaceRecognizer_create() # 拼接trainer.yml的绝对路径 trainer_path = os.path.join(script_dir, 'trainer', 'trainer.yml') recognizer.read(trainer_path) # 同样处理分类器文件,避免后续可能的路径问题 cascadePath = os.path.join(script_dir, "haarcascade_frontalface_default.xml") faceCascade = cv2.CascadeClassifier(cascadePath);
这样修改后,不管你在终端哪个目录下运行python3 /home/pi/Cascades2/03_face_recognition.py,脚本都能精准找到需要的文件啦。
内容的提问来源于stack exchange,提问作者FlorianS




