2. 开发环境搭建:Python虚拟环境配置、OpenCV编译与安装、依赖库管理
说实话,做目标跟踪这个方向,环境搭不好,后面全是坑。我见过太多同学,代码写好了,一跑报错,最后发现是OpenCV版本不对,或者dlib死活装不上。嗯,咱们今天就把这事一次性搞定。
核心思路:用虚拟环境隔离项目依赖,避免“一个项目装库,另一个项目崩掉”的惨剧。OpenCV建议从源码编译,这样能拿到完整的contrib模块。dlib嘛,装起来有点小脾气,得顺着它来。
2.1 Python虚拟环境:为什么必须用?
你想想看,一个项目要OpenCV 4.5,另一个要OpenCV 3.4,装在一起不就打架了吗?虚拟环境就是给每个项目一个独立的小房间。
我个人习惯用 venv,Python 3.3以上自带,不用额外装东西。操作很简单:
# 创建虚拟环境
python -m venv tracking_env
# 激活(Windows)
tracking_env\Scripts\activate
# 激活(Linux/Mac)
source tracking_env/bin/activate
# 退出
deactivate
激活后,终端前面会出现 (tracking_env) 字样。这时候你装的所有库,都只在这个环境里生效。
我的小习惯:每个项目根目录下建一个 .venv 文件夹,然后配个 .gitignore 把它忽略掉。这样代码传到GitHub上,别人拉下来自己建环境就行。
2.2 OpenCV编译与安装:别偷懒,自己编译
很多人图省事,直接 pip install opencv-python。但这样装的是阉割版——没有contrib模块,没有GPU加速,连SIFT、SURF这些经典特征提取器都跑不了。
我在项目中遇到过,用pip装的OpenCV跑目标跟踪,结果想用TrackerCSRT,直接报错说找不到模块。查了半天,原来是contrib没装。从那以后,我都是自己编译。
编译步骤其实不复杂,但有几个坑要注意:
# 1. 安装依赖(Ubuntu为例)
sudo apt-get update
sudo apt-get install build-essential cmake git pkg-config
sudo apt-get install libjpeg-dev libtiff-dev libpng-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libgtk2.0-dev libcanberra-gtk-module
# 2. 下载源码
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
# 3. 编译
cd opencv
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON ..
make -j$(nproc)
sudo make install
注意:如果你没有NVIDIA显卡,把 WITH_CUDA 和 WITH_CUDNN 都设成 OFF。否则编译会报错,而且白白浪费时间。
编译时间取决于你的机器配置。我当年用一台老笔记本,make跑了快两个小时。嗯,泡杯咖啡,看看文档,回来就好了。
2.3 依赖库管理:numpy、imutils、dlib
装好OpenCV后,还有几个库要配。咱们一个一个来:
| 库名 | 用途 | 安装方式 | 注意事项 |
|---|---|---|---|
| numpy | 数组运算、图像矩阵操作 | pip install numpy |
OpenCV依赖它,建议先装 |
| imutils | 图像处理工具函数(旋转、缩放等) | pip install imutils |
纯Python库,安装无坑 |
| dlib | 人脸检测、特征点提取、目标跟踪 | pip install dlib |
需要C++编译环境,容易报错 |
numpy:基础中的基础
说白了,OpenCV读进来的图像就是一个numpy数组。你后面做图像处理、特征提取,全得靠它。安装很简单:
pip install numpy
建议装最新版,老版本有些矩阵操作会慢一些。
imutils:偷懒神器
这个库是我个人很喜欢的。它把OpenCV里一些繁琐的操作封装成了简单函数。比如图像旋转,OpenCV要写好几行,imutils一行搞定:
from imutils import rotate
rotated = rotate(image, angle=45)
我在做目标跟踪数据预处理时,经常用它来批量旋转、缩放图像,省了不少事。
dlib:有点脾气,得哄着装
dlib的安装是本章最大的坑。如果你直接 pip install dlib,大概率会报错,因为它在编译时需要C++11支持,而且依赖Boost库。
我曾经在一台CentOS服务器上装dlib,折腾了整整一下午。最后发现是gcc版本太老,升级到4.9以上就好了。
推荐的做法:
# 先装依赖
sudo apt-get install libboost-all-dev
sudo apt-get install cmake
# 用pip装(如果不行,试试下面源码安装)
pip install dlib
# 如果pip失败,从源码编译
git clone https://github.com/davisking/dlib.git
cd dlib
mkdir build && cd build
cmake ..
cmake --build .
cd ..
python setup.py install
避坑指南:如果你用的是Windows,建议直接装预编译的wheel包。去 https://pypi.org/project/dlib/ 找对应Python版本的.whl文件,然后 pip install xxx.whl。省去编译的烦恼。
2.4 验证环境:跑个测试
装完所有库后,建议跑个简单脚本验证一下:
import cv2
import numpy as np
import imutils
import dlib
print("OpenCV version:", cv2.__version__)
print("NumPy version:", np.__version__)
print("dlib version:", dlib.__version__)
# 测试OpenCV是否正常
img = np.zeros((300, 300, 3), dtype=np.uint8)
cv2.imshow("Test", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果能看到一个黑色窗口,说明环境搭建成功。如果报错,别慌,看错误信息,多半是某个库没装好。
总结一下:虚拟环境隔离项目,OpenCV自己编译拿全功能,dlib装的时候注意编译器版本。这三步走完,后面的课程就顺畅了。