4. Python 环境与依赖库安装
做相机标定,说白了就是跟 Python 和几个关键库打交道。我见过不少新手,代码写好了,结果环境配了一整天——版本冲突、路径不对、库装不上。嗯,这一章咱们就把这事彻底搞定。
4.1 Anaconda:为什么我推荐它
Python 环境管理工具不少,但我个人习惯用 Anaconda。为什么?因为它自带 conda 包管理器,能帮你隔离项目环境。你想想看,做标定用 OpenCV 4.x,做深度学习可能要用 OpenCV 3.x,要是全装在一个环境里,迟早出问题。
核心思路:每个项目一个独立环境,互不干扰。
安装步骤
- 去 Anaconda 官网 下载对应系统的安装包(Python 3.9+ 版本)
- 安装时勾选 "Add Anaconda to my PATH environment variable"(省事)
- 安装完成后打开终端,输入
conda --version验证
我曾经踩过的坑:Windows 上没勾选 PATH,结果每次都要手动切目录。后来我干脆重装了。建议你一步到位。
4.2 创建标定专用环境
我个人习惯给每个项目建独立环境。这样哪怕某个库升级了,也不会影响其他项目。
# 创建环境,指定 Python 版本
conda create -n camera_calib python=3.9
# 激活环境
conda activate camera_calib
# 验证当前环境
python --version
环境名 camera_calib 你可以随便改,但建议起个有意义的。我见过有人起名叫 test1,三个月后自己都忘了是干嘛的。
4.3 核心依赖库安装
标定脚本依赖五个库:OpenCV、NumPy、Matplotlib、glob、os。其中 glob 和 os 是 Python 标准库,不用装。剩下三个需要手动安装。
| 库名 | 用途 | 安装命令 |
|---|---|---|
| OpenCV | 图像读取、角点检测、标定计算 | pip install opencv-python |
| NumPy | 矩阵运算、数组处理 | pip install numpy |
| Matplotlib | 可视化标定结果、绘制误差图 | pip install matplotlib |
小技巧:如果你需要 OpenCV 的 GUI 功能(比如显示图像窗口),装 opencv-python-headless 是不够的,必须装完整版 opencv-python。我在服务器上踩过这个坑,折腾了半天才发现。
一键安装命令
pip install opencv-python numpy matplotlib
装完之后,建议用下面这段代码验证一下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import glob
import os
print("OpenCV version:", cv2.__version__)
print("NumPy version:", np.__version__)
print("All libraries imported successfully!")
如果没报错,说明环境配好了。如果报 ModuleNotFoundError,多半是没激活环境,或者 pip 装到了别的环境里。
4.4 版本兼容性说明
不同版本的库可能会有兼容性问题。我整理了一张表,方便你对照:
| 库名 | 推荐版本 | 最低版本 | 备注 |
|---|---|---|---|
| Python | 3.9 | 3.7 | 3.10+ 部分旧版 OpenCV 不兼容 |
| OpenCV | 4.8.0 | 4.5.0 | 4.x 系列都行,别用 3.x |
| NumPy | 1.24.3 | 1.21.0 | 新版 OpenCV 依赖 NumPy |
| Matplotlib | 3.7.1 | 3.5.0 | 画图用,版本影响不大 |
注意:如果你用的是 M1/M2 Mac,装 OpenCV 时可能会遇到 architecure not supported 错误。解决办法是装 conda install -c conda-forge opencv,别用 pip。
4.5 环境验证与常见问题
装完库之后,我建议你跑一个完整的验证脚本。这能提前暴露问题,而不是等到写标定代码时才抓狂。
验证脚本
import cv2
import numpy as np
# 1. 测试图像读取
img = np.zeros((480, 640, 3), dtype=np.uint8)
cv2.imwrite('test.jpg', img)
img_read = cv2.imread('test.jpg')
print("Image read test:", "PASS" if img_read is not None else "FAIL")
# 2. 测试角点检测
gray = np.zeros((480, 640), dtype=np.uint8)
ret, corners = cv2.findChessboardCorners(gray, (9, 6))
print("Chessboard detection test:", "PASS" if ret else "FAIL (expected)")
# 3. 测试矩阵运算
a = np.array([[1, 2], [3, 4]])
b = np.linalg.inv(a)
print("Matrix inversion test:", "PASS")
print("\nAll tests completed!")
常见问题速查
- ImportError: No module named cv2 → 没装 opencv-python,或者装到了别的环境
- numpy.core.multiarray failed to import → NumPy 版本不兼容,降级到 1.24.x
- libGL.so.1: cannot open shared object file → Linux 上缺 OpenGL 库,装
libgl1-mesa-glx - qt.qpa.plugin: Could not load the Qt platform plugin → Matplotlib 后端问题,加一行
import matplotlib; matplotlib.use('Agg')
4.6 知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以把它当成一个检查清单:
4.7 写在最后
环境配置这事,说白了就是一次性的体力活。但千万别图省事跳过验证步骤。我记得有次帮同事排查问题,他标定结果一直不对,最后发现是 OpenCV 版本太旧,findChessboardCorners 的参数接口都不一样。嗯,这种坑,配好环境就能避免。
现在你的环境已经就绪了。下一件事,就是准备标定板,开始采集数据。