3. Python与OpenCV环境搭建:让树莓派拥有“视觉”
好,上一章我们把树莓派系统跑起来了,也连上了网。现在,我们要给它装上“大脑”——Python环境,以及“眼睛”——OpenCV库。
说白了,摄像头采集到的原始数据就是一串串数字。OpenCV就是那个能把数字变成图像、能识别出人脸、能检测到运动的工具。没有它,摄像头就是个摆设。
我个人习惯,在开始任何项目前,先把基础环境搞干净。就像盖房子前先打地基,地基不稳,后面全是坑。
3.1 检查Python环境
树莓派官方系统(Raspberry Pi OS)默认带了Python3。但版本可能比较老。我们先看看情况。
打开终端,敲入:
python3 --version
如果返回类似 Python 3.9.x 或更高版本,那就没问题。我遇到过有人拿到的是Python 3.7,虽然也能用,但有些新库不支持了。嗯,这里要注意,如果版本低于3.8,我建议你升级一下。
升级Python3的方法(别怕,很简单):
sudo apt update
sudo apt install python3 python3-pip -y
这会把Python3和pip都更新到最新稳定版。
3.2 安装pip与虚拟环境
pip是Python的包管理器。没有它,装库就像没有快递员,得自己满世界找包裹。
检查pip是否安装:
pip3 --version
如果没装,或者版本太老:
sudo apt install python3-pip -y
pip3 install --upgrade pip
这里我强烈建议你使用虚拟环境。为什么?你想想看,不同项目可能依赖不同版本的OpenCV。混在一起,迟早会出冲突。我曾经在一个项目里同时装了OpenCV 4.5和4.7,结果两个都跑不起来,排查了一下午。
创建虚拟环境:
sudo apt install python3-venv -y
mkdir ~/camera_project
cd ~/camera_project
python3 -m venv venv
激活虚拟环境:
source venv/bin/activate
激活后,终端前面会出现 (venv) 字样。这就表示你进入了独立环境。
3.3 安装OpenCV库
OpenCV的安装,可以说是整个环境搭建中最容易出问题的一步。别担心,我帮你踩过坑了。
在虚拟环境中执行:
pip install opencv-python
pip install opencv-contrib-python # 包含额外模块,比如人脸识别
这两个命令会下载预编译的whl包。树莓派是ARM架构,下载速度可能有点慢。如果网络不好,可以试试国内镜像:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后,验证一下:
python3 -c "import cv2; print(cv2.__version__)"
如果打印出版本号(比如 4.9.0),恭喜你,OpenCV装好了。
libcblas.so.3,别慌。执行 sudo apt install libatlas-base-dev libhdf5-dev libhdf5-serial-dev libhdf5-103 -y 就能解决。这是树莓派上常见的依赖缺失问题。
3.4 验证摄像头驱动
环境装好了,摄像头能不能用?得先验证驱动。
树莓派的CSI摄像头接口,驱动是内置的。但需要手动启用。
运行配置工具:
sudo raspi-config
选择 Interface Options → Camera → Enable。重启后生效。
验证摄像头是否被识别:
vcgencmd get_camera
如果返回 supported=1 detected=1,说明摄像头硬件没问题。
再用命令行拍一张测试照片:
raspistill -o test.jpg
如果生成了 test.jpg 文件,说明驱动和硬件都正常。
3.5 编写第一个拍照程序
好了,环境就绪,摄像头就绪。我们来写第一个Python程序,让树莓派拍一张照片并保存到本地。
在 ~/camera_project 目录下,新建一个文件 take_photo.py:
import cv2
import time
# 初始化摄像头
# 0 表示第一个摄像头设备
cap = cv2.VideoCapture(0)
# 检查摄像头是否打开成功
if not cap.isOpened():
print("错误:无法打开摄像头")
exit()
# 让摄像头预热一下
# 我遇到过刚打开摄像头就拍照,画面是黑的
time.sleep(2)
# 读取一帧
ret, frame = cap.read()
if ret:
# 生成文件名,用时间戳避免覆盖
filename = f"photo_{int(time.time())}.jpg"
# 保存到本地
cv2.imwrite(filename, frame)
print(f"照片已保存:{filename}")
else:
print("错误:无法读取画面")
# 释放摄像头资源
cap.release()
cv2.destroyAllWindows()
运行程序:
python3 take_photo.py
如果一切正常,你会看到类似 照片已保存:photo_1701234567.jpg 的输出。用文件管理器打开,就能看到你拍的第一张照片了。
cv2.imshow()),结果报错。因为树莓派默认没有图形界面。如果你需要显示图像,要么用 matplotlib,要么远程连接桌面。否则,只保存文件是最稳妥的方式。
3.6 常见问题与解决
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 摄像头无法打开 | 驱动未启用或硬件接触不良 | 检查 raspi-config 中摄像头是否启用;重新插拔排线 |
| OpenCV安装失败 | 缺少系统依赖库 | 安装 libatlas-base-dev 等依赖 |
| 拍照画面全黑 | 摄像头未预热或曝光时间不足 | 增加 time.sleep(2) 预热时间 |
| 权限不足 | 当前用户不在 video 组 |
sudo usermod -a -G video $USER 然后注销重登 |
3.7 本章小结
到这里,我们已经完成了三件大事:
- 安装了Python3和pip,并配置了虚拟环境
- 成功安装了OpenCV库,并验证了版本
- 验证了摄像头驱动,并写出了第一个拍照程序
说白了,现在你的树莓派已经具备了“看”的能力。下一章,我们会让画面“动起来”——实现实时视频流。到时候,你就可以在浏览器里远程看到摄像头画面了。
嗯,先别急。把今天的内容消化好。环境搭好了,后面就是水到渠成的事。