现代树莓派装 OpenCV 就是一条命令:sudo apt install python3-opencv——老教程里那套【几十行依赖+源码编译两小时】已成历史文物,千万别照抄。
11-1 把环境备好了,本节装主角 OpenCV——本课又一次【教材旧于系统】的重灾区:老书写这节要花两三个小时,现在五分钟。装好的库在系统 Python 里,venv 靠 --system-site-packages 借用(11-1 的参数在这里兑现价值)。11-3 起的每个实验都站在这一节之上。
一、正路:一条命令
sudo apt update
sudo apt install -y python3-opencv
装完验证:
python3 -c "import cv2; print(cv2.__version__)"
看到什么算成功:打印出 4.x.x 形式的版本号(4 是 OpenCV 4 时代的大版本号,具体小版本以实测为准)。
为什么 apt 版是正路(不是偷懒,是质量):
- 与系统配套:apt 版的 Qt 图形库与 Raspberry Pi OS 的 Wayland 桌面匹配,
cv2.imshow窗口开得起来;pip 装的版本常走旧的 X11 兼容层,Wayland 下窗口行为古怪 - numpy 配套:apt 版依赖与系统 numpy 相互校准过;pip 混装容易把 numpy 拉下马,殃及 picamera2、gpiozero 全家(11-1 说的版本打架,这里就是现场)
- 一条命令装完:依赖自动解决,不用手工点名
二、老教程已失效的部分(本节防坑值最高)
老书老博客的 OpenCV 安装章通常长这样,如今全部不必做:
- 十几个
-dev依赖一条条装(libjpeg-dev、libhdf5-dev、libatlas-base-dev……)——那是源码编译的准备清单;apt 装预编译包,依赖自动带齐 pip3 install opencv-python—— 在系统 Python 上执行会被 PEP 668 拒;在 venv 里执行虽可行,但如上所述有 Qt 与 numpy 两个雷- 下载源码、
cmake配置、make编译两三小时 —— 树莓派 4 时代确实常这么干;现在预编译包性能与功能都够,除非有特殊定制需求,源码编译纯属浪费时间 - 装完后还要配环境变量、软链接到系统 Python —— apt 版自动就位,没有这些仪式
判断方法:看到教程从【装一堆 -dev 包】或【wget 源码包】开始讲 OpenCV,直接跳过那段,回到本节的第一条命令。
三、venv 里怎么用(11-1 参数的兑现)
apt 装的 OpenCV 属于系统 Python,venv 里借用:
# 建环境时(或重建时)带参数
python3 -m venv ~/aienv --system-site-packages
source ~/aienv/bin/activate
python3 -c "import cv2; print(cv2.__version__)" # 环境内也能 import 了
环境里 pip install opencv-python 不是正路:它会在环境内再塞一份 OpenCV,把借来的 apt 版【顶掉】,随后 numpy 冲突找上门——apt 装库、venv 借用,分工明确。
四、顺手装的两个小邻居
# numpy 一般随 opencv 自动装上;确认一下
python3 -c "import numpy; print(numpy.__version__)"
# 摄像头画面供帧靠 picamera2(系统预装,10-4 装过)
python3 -c "import picamera2; print('ok')"
三件套齐了(OpenCV 出算法、numpy 存数组、picamera2 供画面),11-3 的第一个实验就能跑。
五、动手 Demo:安装验收三连
sudo apt install -y python3-opencv
python3 - <<'EOF'
import cv2
import numpy as np
print("OpenCV:", cv2.__version__)
print("numpy :", np.__version__)
# 造一张 480x640 的纯色图,让 OpenCV 真干活:存盘再读回
img = np.zeros((480, 640, 3), dtype=np.uint8)
img[:] = (255, 200, 100) # BGR 顺序!11-3 详讲
cv2.imwrite("test_cv.jpg", img)
back = cv2.imread("test_cv.jpg")
print("存盘后读回的尺寸:", back.shape)
EOF
看到什么算成功:打印 OpenCV 版本号、numpy 版本号、【存盘后读回的尺寸: (480, 640, 3)】,且当前目录多出 test_cv.jpg。
读结果:imwrite/imread 一存一读打通,说明 OpenCV 的核心 I/O 正常;shape 的三个数字【高、宽、通道】的顺序从现在起要刻进肌肉记忆(11-3 的第一课)。
六、30 秒实验:一张图占多少内存
一张 640 × 480 的彩色图(BGR 三通道、每通道 1 字节):
- 读进内存是多少字节?合多少 MB?
- 摄像头 30 帧每秒的未压缩视频流,每秒要过多少数据?
参考答案:1. 640 × 480 × 3 = 921,600 字节 ≈ 0.9 MB。2. × 30 = 27,648,000 字节/秒 ≈ 27.6 MB/秒——这解释了为什么视频处理要挑小分辨率(10-4 的 178 MiB/秒账目在这里再次应验),也是 YOLO 实验前先降帧降分辨率的理由。
七、常见误区
- 【照抄老教程先装十几个 -dev 包】 —— 那是源码编译的准备清单;apt 版一条命令,依赖自动解决。
- 【在 venv 里 pip install opencv-python】 —— 顶掉 apt 借来的版本、拉歪 numpy;apt 装库、venv 借用。
- 【cv2 报错=没装好】 —— 先分清错误类型:
ModuleNotFoundError是【环境看不见 apt 库】(补--system-site-packages重建);cv2.error是【代码或数据文件问题】(看 11-4 的路径坑)。 - 【版本号必须和教程一致】 —— 小版本差异(4.8 与 4.11)对本章所有实验无影响;以
cv2.__version__实测为准,别为对齐版本号折腾系统。 - 【imshow 开不出窗口是安装坏了】 —— 无头 SSH 本来就开不了窗口(4-6 的会话级教训);用
imwrite存盘验收,或回桌面跑。
自测三问(点开对答案)
1. 为什么 OpenCV 在树莓派上推荐 apt 装而不是 pip? 2. 老教程的【源码编译两小时】在今天还值得吗? 3. venv 里 `import cv2` 报 ModuleNotFoundError,第一反应查什么? **参考答案** 1. Qt/Wayland 图形配套(imshow 窗口正常)、numpy 与系统库配套不打架、依赖自动解决——apt 版是质量正路,不只是省事。 2. 不值得。预编译包已覆盖常规需求,编译是树莓派 4 时代的老黄历;除非有特殊定制,跳过。 3. 查 venv 建的时候有没有 `--system-site-packages`——环境看不见 apt 装的系统库;重建环境加参数即可。- ☐ 下一节(11-3 OpenCV 的基本使用)
相关笔记
- 建立与管理 Python 虚拟环境 —— 上一节:--system-site-packages 的出处
- OpenCV 的基本使用 —— 下一节:装好的库怎么用
- 使用 Python 操作相机模块 —— picamera2 供帧:OpenCV 实验的画面来源
- 使用命令行安装和卸载应用程序 —— apt 装包的老规矩
- 🍓 树莓派 · 索引 —— 全课路线图