🍓 第十一章 AI 实验范例(一):计算机视觉+AI 识别-OpenCV+YOLO
📄 一句话概括

现代树莓派装 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 版是正路(不是偷懒,是质量):

二、老教程已失效的部分(本节防坑值最高)

老书老博客的 OpenCV 安装章通常长这样,如今全部不必做:

  1. 十几个 -dev 依赖一条条装(libjpeg-dev、libhdf5-dev、libatlas-base-dev……)——那是源码编译的准备清单;apt 装预编译包,依赖自动带齐
  2. pip3 install opencv-python —— 在系统 Python 上执行会被 PEP 668 拒;在 venv 里执行虽可行,但如上所述有 Qt 与 numpy 两个雷
  3. 下载源码、cmake 配置、make 编译两三小时 —— 树莓派 4 时代确实常这么干;现在预编译包性能与功能都够,除非有特殊定制需求,源码编译纯属浪费时间
  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 字节):

  1. 读进内存是多少字节?合多少 MB?
  2. 摄像头 30 帧每秒的未压缩视频流,每秒要过多少数据?

参考答案:1. 640 × 480 × 3 = 921,600 字节 ≈ 0.9 MB。2. × 30 = 27,648,000 字节/秒 ≈ 27.6 MB/秒——这解释了为什么视频处理要挑小分辨率(10-4 的 178 MiB/秒账目在这里再次应验),也是 YOLO 实验前先降帧降分辨率的理由。

七、常见误区

  1. 【照抄老教程先装十几个 -dev 包】 —— 那是源码编译的准备清单;apt 版一条命令,依赖自动解决。
  2. 【在 venv 里 pip install opencv-python】 —— 顶掉 apt 借来的版本、拉歪 numpy;apt 装库、venv 借用。
  3. 【cv2 报错=没装好】 —— 先分清错误类型:ModuleNotFoundError 是【环境看不见 apt 库】(补 --system-site-packages 重建);cv2.error 是【代码或数据文件问题】(看 11-4 的路径坑)。
  4. 【版本号必须和教程一致】 —— 小版本差异(4.8 与 4.11)对本章所有实验无影响;以 cv2.__version__ 实测为准,别为对齐版本号折腾系统。
  5. 【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 装的系统库;重建环境加参数即可。

相关笔记