目录
OpenCV(全称 Open Source Computer Vision Library)是一个开源的计算机视觉和图像处理库,最初由英特尔启动,现在由全球开发者共同维护。它用 C/C++ 编写,提供了丰富的图像处理、视频分析、特征检测、目标识别等算法,同时还提供了 Python、Java 等多种语言的接口,使得在 Python 中调用这些强大的功能变得非常方便。
1. 基本概念
图像读取与处理
OpenCV 能够轻松读取、显示、保存图像以及对图像进行各种处理操作,如图像滤波、边缘检测、颜色空间转换等。
示例代码:import cv2 # 读取图像(默认以彩色读取) img = cv2.imread('image.jpg') # 显示图像 cv2.imshow('Image', img) cv2.waitKey(0) # 等待键盘输入 cv2.destroyAllWindows()
视频处理
除了静态图像,OpenCV 也支持视频的捕获与处理,你可以使用它打开摄像头,进行实时人脸检测或目标跟踪。丰富的算法支持
OpenCV 集成了超过 2500 个优化算法,覆盖了图像滤波、边缘检测、特征提取、机器学习、深度学习(通过 dnn 模块)等领域。
2. Python 接口(cv2)
在 Python 中使用 OpenCV 时,通常导入的包是 cv2
。这个包封装了 OpenCV 的核心功能,配合 NumPy 数组进行图像数据处理。
例如,读取图像后,图像数据其实就是一个多维数组,你可以直接用 NumPy 的操作对其进行处理:
import cv2
import numpy as np
img = cv2.imread('image.jpg')
print("图像尺寸:", img.shape) # 输出例如 (高, 宽, 通道数)
3. 安装与配置
安装 OpenCV 非常简单,有两种常用方法:
pip 安装
在命令行中运行:pip install opencv-python
如果需要更多扩展功能(如额外的模块),可以安装:
pip install opencv-contrib-python
(也可以通过国内镜像源加速下载:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
)
参考了【菜鸟教程】对 Python 版 OpenCV 的安装说明Anaconda 安装
如果你使用 Anaconda 管理 Python 环境,可以用以下命令:conda install -c conda-forge opencv
4.常用API(python)
在 Python 的 OpenCV (cv2
) 库中,有许多常用的 API,涵盖了图像处理、视频处理、特征检测、机器学习等多个方面。以下是一些最常用的 API 及其功能介绍:
1. 图像读取与显示
API | 说明 |
---|---|
cv2.imread(filename, flags) |
读取图像,flags=0 读取灰度图,flags=1 读取彩色图(默认)。 |
cv2.imshow(winname, mat) |
显示图像。 |
cv2.waitKey(delay) |
等待键盘输入,delay=0 表示无限等待。 |
cv2.destroyAllWindows() |
关闭所有 OpenCV 窗口。 |
cv2.imwrite(filename, img) |
保存图像。 |
示例:
import cv2
img = cv2.imread('image.jpg') # 读取图像
cv2.imshow('Image', img) # 显示图像
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows() # 关闭窗口
2. 基本图像操作
API | 说明 |
---|---|
img.shape |
获取图像尺寸 (高度, 宽度, 通道数) 。 |
cv2.cvtColor(img, flag) |
颜色空间转换,例如 cv2.COLOR_BGR2GRAY (彩色转灰度)。 |
cv2.resize(img, dsize, fx, fy) |
调整图像大小。 |
cv2.flip(img, flipCode) |
翻转图像,flipCode=0 垂直翻转,flipCode=1 水平翻转,flipCode=-1 水平+垂直翻转。 |
cv2.rotate(img, rotateCode) |
旋转图像,rotateCode=cv2.ROTATE_90_CLOCKWISE 顺时针旋转90°。 |
cv2.addWeighted(img1, alpha, img2, beta, gamma) |
图像加权融合。 |
示例:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图
resized = cv2.resize(img, (300, 300)) # 调整大小
flipped = cv2.flip(img, 1) # 水平翻转
cv2.imshow('Flipped', flipped)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 图像绘制
API | 说明 |
---|---|
cv2.line(img, pt1, pt2, color, thickness) |
画直线。 |
cv2.rectangle(img, pt1, pt2, color, thickness) |
画矩形。 |
cv2.circle(img, center, radius, color, thickness) |
画圆形。 |
cv2.putText(img, text, org, font, fontScale, color, thickness) |
绘制文本。 |
示例:
cv2.line(img, (50, 50), (200, 50), (0, 255, 0), 2) # 画直线
cv2.rectangle(img, (50, 100), (200, 200), (255, 0, 0), 2) # 画矩形
cv2.circle(img, (150, 300), 50, (0, 0, 255), -1) # 画实心圆
cv2.putText(img, 'Hello OpenCV', (50, 400), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2)
cv2.imshow('Drawing', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 图像滤波
API | 说明 |
---|---|
cv2.GaussianBlur(img, ksize, sigmaX) |
高斯模糊。 |
cv2.medianBlur(img, ksize) |
中值模糊。 |
cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace) |
双边滤波。 |
cv2.Canny(img, threshold1, threshold2) |
Canny 边缘检测。 |
示例:
blurred = cv2.GaussianBlur(img, (5, 5), 0) # 高斯模糊
edges = cv2.Canny(img, 100, 200) # Canny 边缘检测
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 形态学操作
API | 说明 |
---|---|
cv2.erode(img, kernel, iterations) |
腐蚀(去掉小亮点)。 |
cv2.dilate(img, kernel, iterations) |
膨胀(增强白色区域)。 |
cv2.morphologyEx(img, op, kernel) |
形态学变换,如 cv2.MORPH_OPEN (开运算),cv2.MORPH_CLOSE (闭运算)。 |
示例:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dilated = cv2.dilate(img, kernel, iterations=1)
cv2.imshow('Dilated', dilated)
cv2.waitKey(0)
cv2.destroyAllWindows()
6. 视频处理
API | 说明 |
---|---|
cv2.VideoCapture(0) |
打开摄像头(0 代表默认摄像头)。 |
cap.read() |
读取一帧视频。 |
cv2.VideoWriter(filename, fourcc, fps, frameSize) |
保存视频。 |
示例(打开摄像头并显示):
cap = cv2.VideoCapture(0) # 打开摄像头
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
7. 人脸检测
API | 说明 |
---|---|
cv2.CascadeClassifier(xml_file) |
载入 Haar 级联分类器模型。 |
cascade.detectMultiScale(img, scaleFactor, minNeighbors) |
进行人脸检测。 |
示例:
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
8. 机器学习
API | 说明 |
---|---|
cv2.ml.SVM_create() |
创建支持向量机(SVM)模型。 |
cv2.ml.KNearest_create() |
创建 KNN 模型。 |
cv2.dnn.readNetFromONNX(model) |
读取 ONNX 预训练模型。 |
5. 应用领域
由于 OpenCV 提供了丰富的图像处理工具,它被广泛应用于:
人脸检测与识别:利用预训练模型检测人脸。
目标跟踪:在视频中跟踪移动目标。
图像分割:提取感兴趣区域。
增强现实与 3D 重建:结合多视角图像生成三维模型。
机器学习和深度学习:借助 OpenCV 的 dnn 模块加载预训练的深度学习模型,进行图像分类、物体检测等任务。
6. 简单示例
下面的示例代码展示了如何使用 OpenCV 在 Python 中读取图像并进行简单的边缘检测:
import cv2
# 读取图像并转换为灰度图
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用 Canny 算法进行边缘检测
edges = cv2.Canny(gray, 100, 200)
# 显示原图和边缘检测结果
cv2.imshow('Original', img)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
掌握 OpenCV 不仅可以帮助理解图像处理的基本原理,还能为以后在计算机视觉、人工智能等领域的深入研究打下坚实基础。可以先从简单的图像读取和显示开始,逐步探索边缘检测、人脸识别等更复杂的应用。
可以查阅 OpenCV 官方文档或【OpenCV中文网站】
,这些都是非常有用的参考资料。
希望这份介绍能帮助大家入门 Python 中的 OpenCV,祝大家学习愉快!