2. OpenCV基础与环境搭建
各位同学,欢迎来到第二章。这一章我们不讲算法,先把手弄脏——把 OpenCV 的环境搭起来,再跑通第一个程序。
我见过太多人卡在环境配置这一步。明明代码逻辑没问题,就是跑不起来。说白了,环境没配好,后面全是白搭。所以这一章,咱们稳扎稳打,把地基打牢。
2.1 OpenCV 是什么?
OpenCV 全称是 Open Source Computer Vision Library,开源计算机视觉库。它不是一个软件,而是一套 C++ 写的函数库,给 Python、Java 等语言提供了接口。
你可以把它理解成「视觉界的瑞士军刀」。读图、写图、滤波、边缘检测、特征匹配……你能想到的图像处理操作,它基本都有现成的函数。
我个人习惯把 OpenCV 比作「图像处理的工具箱」。你不需要自己造轮子,直接拿工具干活就行。
核心定位: OpenCV 是工业质检项目中最底层的图像处理引擎。YOLO 做检测,OpenCV 做预处理和后处理,两者缺一不可。
2.2 核心模块介绍
OpenCV 模块很多,但工业质检最常用的就三个。我列个表,你一眼就能看明白。
| 模块名 | 作用 | 常用函数举例 |
|---|---|---|
| core | 核心数据结构,矩阵运算 | Mat, Point, Scalar, Size |
| imgproc | 图像处理算法 | cvtColor, GaussianBlur, Canny, threshold |
| highgui | GUI 窗口、图像/视频显示 | imread, imshow, waitKey, imwrite |
你想想看,一个典型的质检流程:highgui 读图 → imgproc 做预处理(去噪、增强)→ core 做矩阵运算(ROI 提取)→ 再交给 YOLO 推理 → 最后用 highgui 显示结果。三个模块串起来,就是一个完整的流水线。
我的经验: 刚开始学的时候,别贪多。先把这三个模块用熟,其他模块(如 calib3d、features2d)等用到再查文档。我当年就是想把所有模块都啃一遍,结果浪费了很多时间。
2.3 Windows 环境配置
Windows 下配置 OpenCV,我推荐用 Python + pip 的方式。简单、干净、好维护。
2.3.1 安装 Python
去 Python 官网下载 3.8 或 3.10 版本。安装时记得勾选「Add Python to PATH」。
避坑: 我曾经遇到过学生装了 Python 3.12,结果某些 OpenCV 旧版本不兼容。建议用 3.8 或 3.10,这两个版本最稳。
2.3.2 安装 OpenCV
打开命令行(cmd 或 PowerShell),执行:
pip install opencv-python
pip install opencv-contrib-python # 包含额外模块
验证安装:
python -c "import cv2; print(cv2.__version__)"
如果输出版本号(比如 4.8.0),说明安装成功。
2.3.3 安装 IDE
我个人习惯用 VS Code,轻量、插件丰富。当然 PyCharm 也行,看你自己喜好。
2.4 Linux 环境配置
工业现场大部分是 Ubuntu 系统。配置方式跟 Windows 类似,但有些细节要注意。
2.4.1 安装 Python 和 pip
sudo apt update
sudo apt install python3 python3-pip -y
2.4.2 安装 OpenCV
pip3 install opencv-python
pip3 install opencv-contrib-python
验证方式跟 Windows 一样:
python3 -c "import cv2; print(cv2.__version__)"
我的建议: 在 Linux 下,推荐用虚拟环境(venv 或 conda)。这样不同项目之间不会互相干扰。我曾经在一个服务器上同时跑三个项目,每个项目依赖的 OpenCV 版本都不一样,虚拟环境帮我省了不少事。
2.5 第一个 OpenCV 程序
环境搭好了,咱们写个程序试试。目标:读取一张图片,显示出来,再保存一份副本。
2.5.1 准备一张图片
在项目目录下放一张图片,比如 test.jpg。随便什么图片都行,最好是彩色的,这样效果明显。
2.5.2 写代码
新建一个 Python 文件,比如 first_opencv.py,输入以下代码:
import cv2
# 1. 读取图像
img = cv2.imread('test.jpg')
# 检查是否读取成功
if img is None:
print("图片读取失败,请检查文件路径")
exit()
# 2. 显示图像
cv2.imshow('My First OpenCV Image', img)
# 等待按键,参数是等待时间(毫秒),0 表示无限等待
cv2.waitKey(0)
# 3. 保存图像
cv2.imwrite('output.jpg', img)
# 4. 关闭所有窗口
cv2.destroyAllWindows()
print("程序运行完成,图片已保存为 output.jpg")
2.5.3 运行程序
在终端执行:
python first_opencv.py
你会看到一个窗口弹出,显示你的图片。按任意键,窗口关闭,同时项目目录下多了一个 output.jpg 文件。
关键点: cv2.imread() 默认以 BGR 格式读取图片,不是 RGB。这一点在后续跟 YOLO 对接时非常重要,因为 YOLO 用的是 RGB。到时候需要做颜色空间转换。
2.6 核心函数详解
刚才用到的几个函数,我展开讲讲。这些是 OpenCV 最基础、最常用的函数,后面几乎每个项目都会用到。
2.6.1 cv2.imread()
读取图像。参数有两个:文件路径和读取方式。
| 读取方式 | 标志 | 说明 |
|---|---|---|
| 彩色 | cv2.IMREAD_COLOR (1) | 默认方式,读取为 BGR 三通道 |
| 灰度 | cv2.IMREAD_GRAYSCALE (0) | 读取为单通道灰度图 |
| 不变 | cv2.IMREAD_UNCHANGED (-1) | 包含 Alpha 通道(透明度) |
举个例子:
img_color = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
img_gray = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
2.6.2 cv2.imshow()
显示图像。第一个参数是窗口名称,第二个参数是图像数据。
注意: imshow() 必须配合 waitKey() 使用,否则窗口会一闪而过。我刚开始学的时候就犯过这个错,窗口闪一下没了,还以为代码写错了。
2.6.3 cv2.waitKey()
等待键盘输入。参数是等待时间(毫秒)。
waitKey(0):无限等待,直到按键waitKey(1000):等待 1 秒,超时自动继续- 返回值:按键的 ASCII 码,可用于判断按了哪个键
2.6.4 cv2.imwrite()
保存图像。参数是文件路径和图像数据。支持多种格式:jpg、png、bmp 等。
cv2.imwrite('output.png', img) # 保存为 PNG 格式
2.7 本章知识结构图
下面这张图,把本章的核心知识点串起来了。你可以把它当作一张「地图」,随时回来对照。
2.8 常见问题与避坑
最后,我总结几个新手最容易踩的坑。这些都是我在项目里真实遇到过的。
- 路径问题:
imread()读取失败时,返回None。一定要加判空检查,否则后面调用imshow()会直接崩溃。 - 窗口卡死: 忘了写
waitKey(),窗口无响应。记住,imshow()和waitKey()是成对出现的。 - 颜色不对: OpenCV 默认 BGR,用 matplotlib 显示时颜色会偏蓝。需要先用
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)转换。 - 版本兼容: OpenCV 4.x 和 3.x 有些 API 不一样。建议统一用 4.5 以上版本。
我的习惯: 每次写 OpenCV 代码,第一行一定是 import cv2,第二行打印版本号 print(cv2.__version__)。确认版本无误,再往下写。这个小习惯帮我避免了很多版本相关的 bug。
好了,这一章的内容就到这里。环境搭好了,第一个程序也跑通了,接下来就可以正式开始图像处理的学习了。