OpenCV代码Ubuntu 18.04正常,树莓派3 Raspbian运行报错求助
这个问题我碰到过,本质是Python版本兼容性导致的——你的树莓派用的是Python 3.5,而Ubuntu应该是3.6及以上的版本,这两个版本对pathlib.Path和os.path.join的兼容性处理不一样。
错误原因分析
Traceback (most recent call last): File "RPi_deneme.py", line 201, in cv2.imwrite(os.path.join(cikisklasoru, img_name), Frame) File "/home/pi/.virtualenvs/cv/lib/python3.5/posixpath.py", line 89, in join genericpath._check_arg_types('join', a, *p) File "/home/pi/.virtualenvs/cv/lib/python3.5/genericpath.py", line 143, in _check_arg_types (funcname, s.class.name)) from None TypeError: join() argument must be str or bytes, not 'PosixPath'
在Python 3.5中,os.path.join只接受字符串或字节类型的参数,但你传入了pathlib.Path生成的PosixPath对象(也就是变量cikisklasoru),所以触发了类型错误。而Python 3.6及以后的版本,官方已经优化了os.path.join的参数支持,允许直接传入Path对象,这就是为什么你的代码在Ubuntu上能正常运行的原因。
三种修复方案
方案1:将Path对象转为字符串
最简单的修改方式是把cikisklasoru用str()包裹,转换成os.path.join能识别的字符串类型:cv2.imwrite(os.path.join(str(cikisklasoru), img_name), Frame)这种改动最小,不需要调整其他代码逻辑。
方案2:全程使用pathlib的路径拼接
既然你已经用了pathlib.Path来创建带时间戳的文件夹,不如统一用pathlib的语法来拼接路径(用/操作符),再转成字符串传给cv2.imwrite:# 用pathlib拼接路径 save_path = cikisklasoru / img_name # 转成字符串后写入 cv2.imwrite(str(save_path), Frame)这种方式更贴合pathlib的设计思路,也能避免os模块和pathlib的类型冲突。
方案3:升级Python版本(可选)
如果你的树莓派环境允许,可以把Python版本升级到3.6及以上。升级后os.path.join就能直接接受Path对象,不需要修改现有代码。不过树莓派系统升级Python可能涉及依赖调整,操作前建议备份环境。
修改后在树莓派上测试,应该就能正常将抓拍图片保存到对应时间戳的文件夹里了。
内容的提问来源于stack exchange,提问作者Konrul

