先说一个真实场景:我见过太多人拿到树莓派的第一天,就急着去跑人脸识别门禁,结果卡在 OpenCV 安装这一步折腾到凌晨两点。搜索栏里“树莓派安装opencv”“opencv安装教程”的热度一直很高,但网上 90% 的教程还在教你源码编译,而 99% 的人其实根本不需要源码编译。这篇安装篇就是把这个环节彻底讲清楚:为什么选这个方案、每一步在干什么、出了报错怎么定位,全部按我实际跑过的流程来写。读完你不仅能装好 OpenCV,还能知道自己手里这台板子后续做树莓派人脸识别项目时,哪些配置是必须提前处理好的。
2. 起步之前,先想清楚一个核心问题:你这台树莓派该怎么装OpenCV
很多教程一上来就甩编译命令,根本不看读者是什么系统、什么板子。实际上,树莓派安装 OpenCV 的方案选择,直接影响后面 2 到 4 个小时的体验。
2.1 三种安装方式的对比:速度差多少、风险差多少
树莓派上装 OpenCV 无非三条路:pip安装、apt安装、源码编译。我在不同版本的树莓派上把三条路都走通过,先说结论:
| 安装方式 | 耗时 | 依赖处理 | 适合场景 |
|---|---|---|---|
| pip 安装 | 5-15 分钟 | 自动处理 Python 依赖 | 64 位系统、跑 Python 人脸识别项目 |
| apt 安装 | 5-10 分钟 | 系统级依赖一起装好 | 32 位系统、不想折腾环境 |
| 源码编译 | 2-5 小时 | 需要手动装一堆依赖 | 需要定制动 能、改底层参数 |
这里必须强调一个很多人踩过的坑:树莓派官方的 32 位系统(armhf)没有 OpenCV 官方的 armv7l wheel。什么意思?就是你在 32 位系统上执行pip install opencv-python,pip 会发现找不到预编译的包,于是自动下载源码开始编译——你本来只想装个库,结果被迫进入了编译地狱。少则两个小时,多则直接失败。
所以装 OpenCV 之前,第一步一定是确认系统位长,而不是直接敲命令。
2.2 第一步先确认系统位长:32位还是64位
检查命令很简单:
uname -m输出aarch64代表 64 位系统,输出armv7l代表 32 位系统。
- 如果你用的是树莓派 5,官方系统默认就是 64 位,基本不会遇到这个问题。
- 如果你用的是树莓派 4B,烧录时选择了 32 位镜像,后面大概率会在 OpenCV 上卡很久。
- 树莓派 3B 和更老型号虽然也能跑 64 位系统,但性能有限,我建议直接按 32 位系统来规划,用
apt安装路线。
针对不同情况,我的推荐非常明确:
64 位系统用户:用pip安装opencv-contrib-python-headless,这是最省心的方案,后面会细说。32 位系统用户:直接用apt安装python3-opencv,或者借助树莓派社区源piwheels来装预编译好的 wheel。
这里要顺带提一个关键点:树莓派官方系统的 pip 默认配置了piwheels这个额外的软件源,里面有很多针对树莓派 CPU 优化的预编译包,包括 OpenCV。很多人换了国内 pip 镜像源之后,把这个配置覆盖掉了,结果 OpenCV 安装速度骤降,甚至开始源码编译。后面我会专门讲怎么规避。
2.3 人脸识别用户直接选contrib包的理由
OpenCV 有主仓库和 contrib 扩展仓库之分。在使用pip安装时,表现为opencv-pythonvsopencv-contrib-python。
如果你只是做一般图像处理,比如灰度转换、边缘检测、颜色识别,主仓库就够用。但人脸识别项目有个特殊点:经典的 LBPH 人脸识别算法(cv2.face.LBPHFaceRecognizer_create)在 contrib 模块里,主仓库的cv2包里压根没有face这个子模块。
这就是为什么网上很多人跑人脸识别代码时,报出module 'cv2' has no attribute 'face'这个错误。不是你代码写错了,是包装错了。
所以我给人脸识别项目的建议是:直接装opencv-contrib-python或opencv-contrib-python-headless。虽然你可能暂时用不到 SIFT、 SURF 这些扩展算法,但 face 模块一定会在训练人脸模型时用到,不如一步到位。
3. 装OpenCV前必须做好的三件套准备:系统源、存储空间、摄像头
在敲安装命令之前,还有几个环境层面的准备工作。这些工作看起来跟 OpenCV 无关,但没做好,后面你会在各个奇怪的环节翻车。
3.1 系统更新与存储扩容
首先是系统更新,这个没啥说的:
sudo apt update && sudo apt upgrade -yapt upgrade可能会花很长时间,尤其在老旧的 3B 上,建议耐心等完。这是为了避免系统自带的一些库版本过旧,跟后面 OpenCV 的依赖产生冲突。
然后是存储扩容。树莓派系统烧录到 SD 卡后,默认不会使用全部空间,尤其用官方镜像烧录工具时,你需要手动扩展文件系统。最稳妥的方式:
sudo raspi-config进入Advanced Options->Expand Filesystem,然后重启。
这一步容易被忽略,但影响很大。OpenCV 无论哪个版本都不小,加上后续人脸识别项目要存训练数据、照片样本,系统盘空间不够会出现各种诡异问题。比如我遇到过有人编到一半,SD 卡满了,make直接报错,查了半天才发现是磁盘空间不够。
3.2 apt源和pip源的配置:顺手把piwheels保住
国内网络环境下,换源是常态。apt 源的替换不复杂,网上有大量教程,核心就是把sources.list和sources.list.d/raspi.list里的官方地址替换成国内镜像地址,然后sudo apt update。
我更想提醒的是 pip 源。许多人的操作是:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这个操作很好,但它会把树莓派官方配置的piwheels覆盖掉吗?不一定。关键在于原来的配置文件里用的是extra-index-url而不是index-url,这两个是并存的。树莓派官方系统在/etc/pip.conf里默认写的是:
[global] extra-index-url=https://www.piwheels.org/simple正确做法是:在设置国内 pip 源时,保留这个extra-index-url,或者手动把它加回去:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple extra-index-url = https://www.piwheels.org/simple这样既享受到国内镜像的下载速度,又保留了 piwheels 对 armv7l 架构预编译包的补充能力。这一步在 32 位树莓派上格外关键,因为在 armv7l 上没有官方 OpenCV wheel,只能靠 piwheels。
3.3 确认摄像头在工作:libcamera还是V4L2
树莓派摄像头有 CSI 接口的官方模块(比如 OV5647),也有 USB 摄像头。它们的确认方式不同。
如果你用 USB 摄像头,插上后执行:
lsusb能看到摄像头设备。再用:
v4l2-ctl --list-devices或者:
ls /dev/video*能看到/dev/video0,基本就说明系统识别了。
如果你用 CSI 接口的树莓派官方摄像头模块,新版系统(Bullseye 之后)默认走 libcamera 框架,老命令raspistill已经废弃了。先确保在raspi-config里启用了 Camera 接口,然后执行:
libcamera-hello能看到实时预览画面,说明摄像头链路是通的。这一步的作用,是把“摄像头硬件问题”和“OpenCV 读取问题”分开,不至于后面代码读不到画面时一头雾水。
3.4 功耗、散热和内存是硬约束
很多人在安装 OpenCV 时遇到莫名其妙的卡死、失败,最后发现是供电不足或者温度过高。
树莓派的官方电源是 5V 3A,但很多人用手头闲置的充电头凑合,一旦 CPU 满载,电压跌落,板子就会重启或者外设失灵。我见过编译 OpenCV 编到一半板子直接重启的,换了个正规 5V 3A 电源后再也没出现过。
散热也是硬约束。树莓派 4B 在长时间高负载下,CPU 温度很快就会超过 85 度,过热触发降频后编译速度暴跌。源码编译建议加散热片和风扇,至少也要有个散热片。随时可以用这条命令看温度:
vcgencmd measure_temp内存方面,树莓派 1GB、2GB 版本在编译大项目时容易内存不足。如果决定源码编译,建议先把 SWAP 扩大,后面会讲具体操作。
4. 实战安装,三条路我建议你这样走
准备工作做完,下面是正式的安装环节。我按实际推荐顺序给出三条路线,你可以按自己的系统情况选择。
4.1 方式一:Python虚拟环境里用pip安装(首选)
这是我在 64 位树莓派上最常用的方案,速度最快、最干净,也最容易卸载。
强烈建议先建一个虚拟环境,避免后面人脸识别项目依赖的一堆包跟你系统 Python 环境互相污染。树莓派官方系统从 Bookworm 开始,Python 还启用了外部环境管理保护,直接在系统 Python 里pip install会报externally-managed-environment的错误,虚拟环境天然规避这个问题。
python3 -m venv ~/cv_env source ~/cv_env/bin/activate然后升级 pip,顺手安装 OpenCV:
pip install --upgrade pip pip install opencv-contrib-python-headless如果是需要显示图像窗口的桌面应用,把最后的包名换成opencv-contrib-python,后面会解释 headless 和非 headless 的区别。
这条命令跑完,正常情况下 OpenCV 就装好了。64 位系统有官方 prebuilt wheel,下载速度取决于你的网络。国内镜像源配好之后,整个安装过程不会超过十分钟。
4.2 方式二:apt安装python3-opencv(省心路线)
如果你用的是 32 位系统,或者不想用虚拟环境、希望在系统层面直接有 OpenCV,那么apt安装最省心:
sudo apt install python3-opencv这个包是树莓派官方仓库里编译好的,适配树莓派的硬件和系统,稳定性很好,而且apt 版本默认编译了 GStreamer 支持,这对后面读取摄像头视频流很有帮助。
缺点也很明显:版本一般落后于 pip 官方版,而且它默认可能不带 contrib 模块的 face 部分。具体要看 apt 源里的包版本,早期树莓派源里的 python3-opencv 不带 contrib,后来才逐渐补上。如果你用 apt 版跑cv2.face失败,那就得斟酌一下是否改用 pip 方案了。
针对 32 位系统的 pip 用户,我可以补充一个具体操作:把 piwheels 配好之后,执行:
pip install opencv-contrib-python-headless同样能拿到 piwheels 编译好的 armv7l wheel,不走源码编译。这个方案适合希望统一用 pip 管理项目的用户。
4.3 方式三:源码编译(定制路线)
读者可能会问:你还说 90% 的人不需要源码编译,那剩下 10% 是什么人?至少包括这几类:
- 需要修改 OpenCV 源码进行调试的开发者
- 需要开启一些默认没编译的功能模块的人
- 想最大化榨取树莓派性能,在编译时针对 CPU 指令集做优化的硬核玩家
- 想用 CSI 摄像头且无法接受 V4L2 兼容方案的人,需要编译 GStreamer 支持
如果确实需要源码编译,我建议明确预期:在树莓派 4B 上大约两到三个小时,在 3B+ 上可能四小时以上。有散热条件下再操作。
先装依赖:
sudo apt install -y build-essential cmake git pkg-config \ libjpeg-dev libtiff-dev libpng-dev \ libavcodec-dev libavformat-dev libswscale-dev \ libv4l-dev libxvidcore-dev libx264-dev \ libgtk-3-dev libatlas-base-dev gfortran python3-dev然后拉取源码,注意版本号建议选定某一个稳定 tags,不要直接拉 master:
cd ~ git clone --depth 1 --branch 4.10.0 https://github.com/opencv/opencv.git git clone --depth 1 --branch 4.10.0 https://github.com/opencv/opencv_contrib.git cd opencv mkdir build && cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_V4L=ON \ -D WITH_GSTREAMER=ON \ -D WITH_GTK=ON \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D PYTHON3_EXECUTABLE=$(which python3) \ -D BUILD_EXAMPLES=OFF ..在 2GB 或 4GB 内存的板子上,编译前最好把 SWAP 扩大到 2GB:
sudo dphys-swapfile swapoff sudo nano /etc/dphys-swapfile把CONF_SWAPSIZE改成 2048,然后:
sudo dphys-swapfile swapon编译时以make -j4开始(4 核全开),如果编译过程中系统卡死,就降成make -j2。最后:
make -j4 sudo make install sudo ldconfig源码编译完成后,OpenCV 会被安装到/usr/local目录,Python 里import cv2时优先加载的就是这套自编译版本。
4.4 三条路线之间的取舍,我的经验判断
给一个最简单的决策逻辑:
- 能跑 64 位系统 + 后续主要用 Python 做人脸识别 -> 直接 pip 装
opencv-contrib-python-headless。 - 32 位系统且不想折腾 -> 直接
sudo apt install python3-opencv,能跑就往项目里写代码。 - 明确需要 GStreamer、CSI 摄像头特殊管道、或者想改底层 -> 源码编译,并且预留充足时间。
我自己在树莓派 4B 8GB 版上常年用第一个方案,工作很稳定。在 3B 上给朋友搭环境时用了第二个方案,也很省心。说到底,工具要为项目服务,不要为了显得专业就去折腾编译。
5. 装完别急着写人脸识别,先验证环境和视频链路
装好 OpenCV 只完成了一半,另外一半是确认环境能真正用起来。这一步可以帮你非常快速地区分“环境问题”和“代码问题”。
5.1 import cv2 的三步验证
进入你的虚拟环境,或者直接 Python 交互环境:
python3import cv2 print(cv2.__version__) print(cv2.__file__)第一行输出版本号,比如4.10.0,第二行输出模块路径,可以确认你加载的是哪个环境里的 OpenCV。这一步特别能排查“我装了但导入的不是我装的那份”这类环境混用问题。
接着确认人脸识别需要的 contrib 模块:
import cv2 print(cv2.face)如果能输出<module 'cv2.face'>之类的信息,说明 face 模块存在,后面 LBPH 训练没问题。如果报AttributeError: module 'cv2' has no attribute 'face',说明装成了非 contrib 版本。
5.2 用USB摄像头走通第一个视频流
我建议先用 USB 摄像头做验证,因为 USB 摄像头走 V4L2 协议,OpenCV 默认直接支持,最简单。
import cv2 cap = cv2.VideoCapture(0) if not cap.isOpened(): print("Cannot open camera") exit() cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) while True: ret, frame = cap.read() if not ret: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow("Video", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()这段代码能跑起来,说明 OpenCV 读取摄像头的链路是通的。
如果你装的是 headless 版本,cv2.imshow会报错提示The function is not implemented。这是正常的,headless 版本就是不带 GUI 显示功能。两种处理方式:换成带 GUI 的opencv-contrib-python,或者不显示图像,把处理结果存成图片文件。
5.3 如果用的是CSI摄像头(ov5647)该怎么接
CSI 接口的官方模块在树莓派上更常见,但也更麻烦。核心问题在于新版树莓派系统默认用 libcamera 框架,OpenCV 的 VideoCapture 走的却是 V4L2 接口,两者之间需要一层兼容。
我的处理过程是这样的:
第一步,确保 libcamera 工具装好:
sudo apt install -y libcamera-apps第二步,把 CSI 摄像头在系统层调试通。执行libcamera-hello,能看到预览画面就说明摄像头本身是好的。
第三步,在 OpenCV 里去读取。一个可行的方法是通过 libcamera 提供的 V4L2 兼容层让 OpenCV 的 VideoCapture 生效:
sudo apt install -y libcamera-v4l2然后运行时加上环境变量:
export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libcamera/v4l2-compat.so python3 your_script.py注意:这个路径在不同系统架构上可能不同,用dpkg -L libcamera-v4l2查一下实际路径。
如果你手里的 OpenCV 是源码编译并开启了 GStreamer,也可以用 GStreamer 管道读取:
cap = cv2.VideoCapture( "libcamerasrc ! videoconvert ! video/x-raw,format=BGR ! appsink", cv2.CAP_GSTREAMER )需要提醒的是:官方 pip 的 OpenCV wheel 没有编译 GStreamer 支持,所以上面这个管道在 pip 环境里大概率不可用。这就是为什么有些人坚持用 apt 版本或源码编译——他们需要对 CSI 摄像头做直接读取。而很多应用场景下,USB 摄像头配合 pip 版 OpenCV 就是最短路径。
5.4 一行代码验证人脸检测链路
摄像头链路通了之后,再做一个快速验证:确认 OpenCV 自带的 Haar 级联人脸检测模型能加载、能在画面里框出人脸。
import cv2 face_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + "haarcascade_frontalface_default.xml" ) cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(60, 60) ) for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow("Face Detection", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()画面里能看到绿色框住人脸,就说明人脸检测的基本链路已经通了。到这里,OpenCV 安装和验证这一阶段就算正式完成。
6. 我实际踩过的坑:安装阶段的四个经典报错与定位思路
下面这些报错,如果你在搜索框里搜过,多半就是卡住了。我把排查链路完整写出来,避免你在错误的思路上花太多时间。
6.1 No module named 'cv2':多数是Python环境混了
这个报错在安装完成后第一次 import 时最常见。真正的报错原因很少是“没装上”,而是“装到了别的 Python 环境里”。
排查链路是这样的:
确认当前用哪个 Python:
which python3确认这个 Python 能不能找到 cv2:
python3 -c "import cv2; print(cv2.__file__)"检查 pip 装到了哪里:
pip show opencv-contrib-python-headless看 Location 路径是否跟
sys.path匹配。
最常见的原因是大家建了虚拟环境后忘了激活,直接在系统 Python 里 pip install,然后又回到虚拟环境里去 import。或者在系统 Python 里装了一份,又被另一个 IDE 自带的解释器干扰。
解决方式其实很简单:激活虚拟环境后,重新pip install opencv-contrib-python-headless,并且在当前这个终端里做完 import 验证。如果你用 VS Code 或 Thonny,记得把解释器路径指到虚拟环境。
6.2 libGL.so.1缺失:桌面版OpenCV的经典报错
这个错误通常出现在你安装的是非 headless 版本,比如:
pip install opencv-contrib-python然后在无桌面的精简系统或者容器环境里 import cv2,报错:
ImportError: libGL.so.1: cannot open shared object file原因是带 GUI 功能的 OpenCV 依赖系统的 OpenGL 库,但最小化环境里没有装。
解决办法很简单,安装缺失的库:
sudo apt update sudo apt install -y libgl1 libglib2.0-0不过,我也要提供一个反向判断:如果你只是做后台服务、把图像处理结果保存到文件,或者往 MQTT、数据库里推送结果,根本不需要 GUI,那就直接用 headless 版本,压根不用碰 libGL 的问题。我的建议是:默认装 headless,等确认自己需要弹出窗口看画面时,再换非 headless 或补装 libgl1。
6.3 module 'cv2' has no attribute 'face':包选错了
这个报错信息足够直白,但很多人会怀疑是版本问题,其实核心就是包选错了。cv2.face存在于 contrib 版本中:
- 安装
opencv-contrib-python或opencv-contrib-python-headless后,cv2.face可用。 - 安装
opencv-python或opencv-python-headless后,cv2.face不存在。
如果你已经装了非 contrib 版本,在虚拟环境里直接:
pip uninstall opencv-python opencv-python-headless pip install opencv-contrib-python-headless再次验证:
import cv2 print(cv2.face)这个模块具有以后训练人脸识别模型时才用得到,但提前确认能少走很多弯路。很多教程为了省事只写“pip install opencv-python”,后面跑人脸识别代码时就必然翻车。
6.4 编译过程卡死或被杀:SWAP与过热复盘
源码编译遇到卡死或者Killed提示,通常是内存不足或者过热。
先说内存不足。树莓派 1GB 或 2GB 内存,在开桌面环境的同时跑编译,内存很容易吃满。内核会直接杀掉 OOM 的进程,表现就是你看到Killed。解决方式是把桌面关掉再编,或者扩大 SWAP。
扩大 SWAP 的完整操作:
sudo dphys-swapfile swapoff sudo nano /etc/dphys-swapfile把CONF_SWAPSIZE=100改为CONF_SWAPSIZE=2048,然后:
sudo dphys-swapfile swapon free -h确认 SWAP 生效。编译完成之后,可以再把 SWAP 改小,保护 SD 卡寿命。
再说过热。树莓派 4B 满载编译时温度飙升非常快,实测无散热片时能达到 85 度以上,触发降频后编译速度会断崖式下跌,甚至系统不稳定。解决方式是在编译时另一终端监控:
watch -n 2 vcgencmd measure_temp如果长时间在 80 度以上,建议暂停编译,装好散热片和风扇,等温度降回 45 度左右再继续。
还有一个经常被忽略的点:make -j4在 1GB 内存的板子上容易 OOM,但换make -j2往往就能稳定编完。不要死磕 4 线程,少花时间比什么都重要。
7. 从安装到人脸识别之间,你还要补上的几块拼图
安装验证完,你手里已经有一套能用的 OpenCV 环境了。但距离一个完整的人脸识别项目,还有几块拼图需要提前知道。
7.1 opencv的wheel屏蔽了GStreamer,影响有多大
官方 pip 的 OpenCV wheel 为了包体积和兼容性,默认没有编译 GStreamer。这意味着你没法用 GStreamer 管道直接读摄像头流。
影响的大小取决于你的摄像头方案:
- USB 摄像头走 V4L2,完全不受影响。
- CSI 摄像头但通过 V4L2 兼容层,基本不受影响。
- CSI 摄像头想用
libcamerasrc管道,就必须要 GStreamer 支持。这时你有两个选择:源码编译 OpenCV,或者用 apt 版本。
我个人的习惯是桌面应用和普通项目一律用 USB 摄像头加 pip 版 OpenCV,CSI 摄像头留给特别在意体积和画质的场景。这个取舍其实很实际,USB 摄像头即插即用,千兆网络传输视频流的项目里甚至可以把画面推给 PC 端处理,树莓派只做采集。
7.2 摄像头画面倒置和帧率偏低怎么处理
这个问题在树莓派人脸识别项目里太常见了。
画面倒置的原因有两类。一类是摄像头物理安装方向问题,用cv2.rotate可以解决:
frame = cv2.rotate(frame, cv2.ROTATE_180)另一类是 CSI 摄像头造了 V4L2 兼容层后的方向问题,可以在运行时设置翻转参数:
export LIBCAMERA_RPI_V4L2_OVERRIDE_FORCE_FORMAT=...这种方式更接近系统层,实际调整时建议先用libcamera-hello --rotation 180确认摄像头本身支持硬件翻转,能硬件翻转就不要在 OpenCV 里做软件翻转,能少一份 CPU 开销。
帧率偏低的问题要分情况。树莓派 CPU 处理cv2.cvtColor和cv2.CascadeClassifier都是比较吃算力的操作,特别是 Haar 级联在 VGA 分辨率下,4B 也可能只有 10 到 15 帧。优化办法:
- 缩小处理分辨率,用 640x480 做检测,不要用 1080p。
- Haar 级联的
scaleFactor从 1.1 调整到 1.2,minNeighbors从 5 调到 6,能跳过不少误检,速度更快。 - 不要把每一帧都做检测,可以每两帧检测一次,中间帧直接沿用上一帧结果。
- 后续进阶可以用 OpenCV 的 DNN 人脸检测器,精度高,但树莓派上需要搭配推理加速。
7.3 下一步:从“能打开摄像头”到“跑通人脸识别”的最短路线
到这里,你剩下的任务其实很清晰了。以 LBPH 算法为例,最短路线是三步:
第一步,采集人脸样本。用 OpenCV 打开摄像头,对同一个人的脸拍下几十张不同角度的照片,灰度化后统一缩放到固定尺寸,比如 100x100。
第二步,训练模型。用cv2.face.LBPHFaceRecognizer_create()创建识别器,把样本和对应标签喂给train()方法。
第三步,识别。摄像头实时帧里检测到人脸后,裁剪出人脸区域,经过同样预处理,调用predict()得到标签和置信度。置信度低于阈值就认为匹配成功,否则视为陌生人。
这三步的代码量不大,但每一环依赖的环境组件,我在前文里都已经替你验证过了:opencv-contrib-python 提供了 face 模块,Harr 级联负责检测,VideoCapture 负责取流。整条链路没有一块是落空的。
我自己在做这个系列项目时最深的体会是:安装阶段多花十分钟做环境验证,比后面在代码里来回试错要划算得多。环境一旦干净,后续所有实验都会顺畅起来。下一篇我们直接进入人脸识别实现部分,会把这套环境真正用起来。