目录
一、OpenCV 简介
OpenCV(Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习库,支持多种语言(C++、Python、Java等)。
提供图像和视频处理的丰富工具
可实现如图像读取、处理、特征检测、目标跟踪、深度学习推理等任务
跨平台,常用于自动驾驶、人脸识别、增强现实、图像分类等领域
OpenCV的优势
- **开源免费:**完全开源,可以自由使用,降低开发成本和技术门槛。
- **多语言支持:**除C++原生接口外,还支持Java、Python等编程语言。
- **跨平台:**支持多种操作系统,Windows、Linux、ios、Android等,方便开发和部署。
- **丰富API:**完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。
1.OpenCV-Python
OpenCV-Python是原始OpenCV C++实现的Python包装器。它结合了 OpenCV C++ API 的高性能与 Python 语言的易用性和简洁性。通过 OpenCV-Python,开发者可以轻松地进行图像处理、计算机视觉任务以及机器学习应用。
与C / C++等语言相比,Python速度较慢。Python可以使用C / C++扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。
OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。
二、环境安装
1. 安装命令(推荐使用 pip)
pip install opencv-python
若需要支持图像显示、视频编解码等完整功能(包括GUI),建议安装如下:
pip install opencv-python opencv-contrib-python
2. 验证安装
import cv2 print(cv2.__version__)
三、图像表示
像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不同,每个像素可以用不同的二进制数表示。
计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像。opencv中常用的是8位图像,大多数彩色和灰度图像使用8位表示每个通道的像素值,范围从0到255,其中0,代表最黑,1,表示最白。
日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。在计算机中,RGB三种颜色被称为RGB三通道,每个通道的取值都是0-255,根据这三个通道存储的像素值,来对应不同的颜色。
OpenCV 图像 = Numpy 数组(矩阵)
读取的图像本质是一个 NumPy 的 多维数组
彩色图像为三维数组:
(高度, 宽度, 通道数)
,通道顺序为 BGR(不是RGB)灰度图像为二维数组:
(高度, 宽度)
import cv2
img = cv2.imread("example.jpg") # 默认读取为BGR
gray = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE)
print(img.shape) # 例如 (480, 640, 3)
print(gray.shape) # 例如 (480, 640)
)
四、图像读取与保存
1.图像在OpenCV中的表示形式
在OpenCV中,图像以NumPy数组的形式存储和处理。数组的维度和数据类型取决于图像的类型(彩色或灰度)以及像素值的范围。
彩色图像 彩色图像通常表示为三维数组,形状为(height, width, channels)
。默认情况下,OpenCV使用BGR顺序存储通道,即蓝、绿、红。例如,一个形状为(480, 640, 3)
的数组表示一个高480像素、宽640像素的彩色图像,包含3个通道。
灰度图像 灰度图像表示为二维数组,形状为(height, width)
。每个像素的值代表亮度,范围从0(黑色)到255(白色)。
2.图像属性和操作
形状(Shape) 通过img.shape
可以获取图像的尺寸信息:
- 彩色图像返回
(height, width, channels)
。 - 灰度图像返回
(height, width)
。
数据类型(dtype) 图像的数据类型决定了像素值的范围。常见的是uint8
(0到255),适用于大多数标准图像。其他类型如float32
用于高动态范围(HDR)图像。
像素访问 可以通过索引直接访问或修改像素值:
- 灰度图像:
value = img[y, x]
。 - 彩色图像:
b, g, r = img[y, x]
(BGR顺序)。
3.像素值的含义
灰度图像 每个像素值表示亮度:
0
:纯黑色。255
:纯白色。- 中间值表示不同深浅的灰色。
彩色图像 每个像素由三个分量(B、G、R)组成,每个分量的值在0到255之间:
[0, 0, 0]
:纯黑色。[255, 255, 255]
:纯白色。- 其他组合表示不同颜色。
示例代码
import cv2
import numpy as np
# 读取彩色图像
img_color = cv2.imread('color_image.jpg')
print(f"彩色图像形状: {img_color.shape}") # 输出 (height, width, 3)
# 读取灰度图像
img_gray = cv2.imread('gray_image.jpg', cv2.IMREAD_GRAYSCALE)
print(f"灰度图像形状: {img_gray.shape}") # 输出 (height, width)
# 修改像素值
img_color[100, 200] = [255, 0, 0] # 将(100, 200)处的像素设为蓝色
img_gray[50, 100] = 128 # 将(50, 100)处的像素设为中灰色
注意事项
- OpenCV默认使用BGR顺序,而其他库(如Matplotlib)可能使用RGB顺序,转换时需要小心。
- 修改图像数据时需确保数据类型和范围正确,避免溢出或类型不匹配。
- 对于高性能操作,推荐使用NumPy的向量化操作而非逐像素修改。
4.相关操作
4.1 图像读取
img = cv2.imread("path/to/image.jpg") # 默认彩色读取
cv2.IMREAD_COLOR
:默认,彩色图像cv2.IMREAD_GRAYSCALE
:灰度图像cv2.IMREAD_UNCHANGED
:包括 alpha 通道
4.2 图像显示
cv2.imshow("Window Name", img)
cv2.waitKey(0) # 等待任意按键
cv2.destroyAllWindows() # 关闭所有窗口
4.3 图像保存
cv2.imwrite("output.jpg", img)
五、基本图像操作
1. 获取图像属性
使用 OpenCV 的 shape
属性获取图像的高度、宽度和通道数(通道数为 3 表示 RGB 图像,1 表示灰度图像)。
img = cv2.imread("example.jpg")
height, width, channels = img.shape
print(f"图像高度: {height}, 宽度: {width}, 通道数: {channels}")
2. 图像裁剪(切片)
通过数组切片提取感兴趣区域(Region of Interest, ROI),格式为 img[y_start:y_end, x_start:x_end]
。
roi = img[100:300, 150:350] # 提取 y=100~300, x=150~350 的区域
cv2.imshow("ROI", roi)
3. 图像缩放
使用 cv2.resize()
调整图像尺寸,参数为目标宽度和高度(单位为像素)。
resized = cv2.resize(img, (300, 200)) # 新宽度 300,高度 200
4. 图像翻转
通过 cv2.flip()
实现垂直、水平或双向翻转,第二个参数控制方向:
0
:垂直翻转(沿 X 轴)1
:水平翻转(沿 Y 轴)-1
:双向翻转
flip_v = cv2.flip(img, 0) # 上下翻转
flip_h = cv2.flip(img, 1) # 左右翻转
flip_both = cv2.flip(img, -1) # 上下+左右翻转
5. 图像旋转(90度)
使用 cv2.rotate()
实现 90°、180° 或 270° 旋转,支持以下模式:
cv2.ROTATE_90_CLOCKWISE
:顺时针 90°cv2.ROTATE_180
:180°cv2.ROTATE_90_COUNTERCLOCKWISE
:逆时针 90°
rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
6. 创建可缩放窗口
通过 cv2.namedWindow()
创建可调整大小的窗口,需配合 cv2.WINDOW_NORMAL
参数。
cv2.namedWindow("MyWindow", cv2.WINDOW_NORMAL)
cv2.imshow("MyWindow", img)
7. 显示图像与等待用户输入
cv2.waitKey(0)
暂停程序直到用户按键,参数为等待时间(毫秒),0
表示无限等待。
cv2.waitKey(0)
8. 释放资源
关闭所有窗口并释放内存资源(如摄像头或视频对象需额外调用 release()
)。
cv2.destroyAllWindows()
# cap.release() # 若使用摄像头或视频,需显式释放
9. 完整示例代码
整合上述操作,实现图像读取、裁剪、缩放、翻转和显示的完整流程。
import cv2
img = cv2.imread("example.jpg")
cv2.namedWindow("Image", cv2.WINDOW_NORMAL)
cv2.imshow("Image", img)
print("图像尺寸:", img.shape)
cropped = img[50:200, 100:300] # 裁剪
resized = cv2.resize(cropped, (200, 100)) # 缩放
flipped = cv2.flip(resized, 1) # 水平翻转
cv2.imshow("Processed Image", flipped)
cv2.waitKey(0)
cv2.destroyAllWindows()