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 OptionsCameraEnable。重启后生效。

验证摄像头是否被识别:

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 的输出。用文件管理器打开,就能看到你拍的第一张照片了。

避坑指南: 我曾经在树莓派上直接运行OpenCV的GUI窗口(比如 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库,并验证了版本
  • 验证了摄像头驱动,并写出了第一个拍照程序

说白了,现在你的树莓派已经具备了“看”的能力。下一章,我们会让画面“动起来”——实现实时视频流。到时候,你就可以在浏览器里远程看到摄像头画面了。

嗯,先别急。把今天的内容消化好。环境搭好了,后面就是水到渠成的事。