1. 数字图像表示
-
一幅尺寸为M·N的图像可以用矩阵表示,每个矩阵元素代表一个像素,元素的值代表这个位置图像的亮度;其中,彩色图像使用3维矩阵M·N·3表示;对于图像显示来说,一般使用无符号8位整数来表示图像亮度,取值范围[0,255]
-
图像数据按照自左向右、自上向下的顺序存储在计算机内存中,坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。
在OpenCV中,RGB彩色图像的通道顺序为BGR。
2. 图像文件的读写与显示
2.1 图像文件的读取
cv2.imread()
是 OpenCV 中用于从文件中读取图像的函数。它支持多种图像格式(如 JPEG、PNG、BMP 等),并将图像读取为 NumPy 数组。
cv2.imread(filename, flags=cv2.IMREAD_COLOR)
参数说明
-
filename
(str):- 图像文件的路径,可以是相对路径或绝对路径。
- 如果路径无效或者文件不存在,
cv2.imread()
会返回None
。
-
flags
(int, 可选):- 控制图像的读取方式,默认值为
cv2.IMREAD_COLOR
。
常见取值包括:
cv2.IMREAD_COLOR
(1
): 以彩色模式加载图像,忽略图像的透明通道。如果图像是灰度图,会将其转换为 BGR(3 通道)。cv2.IMREAD_GRAYSCALE
(0
): 以灰度模式加载图像,返回单通道(8 位深度)。cv2.IMREAD_UNCHANGED
(-1
): 读取图像的原始数据,包括透明通道(若存在)。cv2.IMREAD_ANYCOLOR
: 读取为彩色图像,但会自动适配图像格式。cv2.IMREAD_ANYDEPTH
: 以原始位深(16 位或 32 位浮点)加载图像,而不是默认的 8 位。
- 控制图像的读取方式,默认值为
返回值
- 成功时,返回一个 NumPy 数组,表示图像的像素数据。
- 彩色图像的形状为
(height, width, 3)
(BGR 格式)。 - 灰度图像的形状为
(height, width)
。
- 彩色图像的形状为
- 失败时,返回
None
,通常是因为文件不存在或路径不正确。
2.2 图像文件的显示
cv2.imshow()
是 OpenCV 中用于显示图像的函数,它会在一个窗口中显示加载或处理后的图像。
cv2.imshow(winname, mat)
参数说明
-
winname
(str):- 窗口的名称,可以是任意字符串。
- 如果指定的窗口名称不存在,会自动创建一个窗口并显示图像。
- 多次调用时,若窗口名称相同,则会在同一个窗口内更新显示内容。
-
mat
(ndarray):- 要显示的图像数据,通常是由
cv2.imread()
或其他 OpenCV 图像处理函数生成的 NumPy 数组。 - 支持以下几种格式:
- 彩色图像:形状为
(height, width, 3)
,默认 BGR 格式。 - 灰度图像:形状为
(height, width)
。 - 深度或透明通道图像在某些情况下可能需要预处理以适配。
- 彩色图像:形状为
- 要显示的图像数据,通常是由
特性
- 图像显示的窗口会保持阻塞,直到用户按键关闭窗口(通常需要配合
cv2.waitKey()
使用)。 - 窗口默认大小与图像大小一致,但可以通过
cv2.resizeWindow()
调整大小。
其他相关函数
-
cv2.waitKey(delay)
:- 用于捕获键盘事件。
- 参数
delay
是等待的时间,单位为毫秒。- 如果为
0
,程序会无限等待键盘输入。 - 如果为正整数,则会等待指定时间。
- 如果为
- 返回值是按键的 ASCII 码(例如
27
对应ESC
键)。
示例:
key = cv2.waitKey(0) if key == 27: # 按 ESC 键关闭 cv2.destroyAllWindows()
-
cv2.destroyWindow(winname)
和cv2.destroyAllWindows()
:cv2.destroyWindow(winname)
:关闭特定名称的窗口。cv2.destroyAllWindows()
:关闭所有 OpenCV 创建的窗口。
-
cv2.namedWindow(winname, flags)
:- 用于创建窗口并设置属性。
- 示例:
cv2.namedWindow('Resizable Window', cv2.WINDOW_NORMAL) cv2.imshow('Resizable Window', image) cv2.waitKey(0)
-
cv2.resizeWindow(winname, width, height)
:- 调整窗口大小(需配合
cv2.WINDOW_NORMAL
使用)。 - 示例:
cv2.namedWindow('Resizable Window', cv2.WINDOW_NORMAL) cv2.resizeWindow('Resizable Window', 800, 600) cv2.imshow('Resizable Window', image) cv2.waitKey(0)
- 调整窗口大小(需配合
2.3 图像文件的写入
cv2.imwrite()
是 OpenCV 中用于将图像保存到文件的函数,可以将处理后的图像数据以指定格式保存到磁盘。
cv2.imwrite(filename, img, params=None)
参数说明
-
filename
(str):- 保存图像的完整路径,包括文件名和扩展名。
- 扩展名决定保存图像的格式(例如
.jpg
,.png
,.bmp
,.tiff
等)。 - 示例:
'output.jpg'
或'/path/to/output.png'
。
-
img
(ndarray):- 要保存的图像数据,通常是一个 NumPy 数组。
- 格式可以是:
- 彩色图像:形状为
(height, width, 3)
,数据类型为uint8
。 - 灰度图像:形状为
(height, width)
,数据类型为uint8
。
- 彩色图像:形状为
-
params
(list, 可选):- 图像格式的参数,取决于文件格式。例如,可以指定 JPEG 的压缩质量或 PNG 的压缩级别。
- 常见参数:
- 对于 JPEG (
.jpg
):[cv2.IMWRITE_JPEG_QUALITY, quality]
:quality
是压缩质量(0-100),默认值为 95,值越高质量越好。
- 对于 PNG (
.png
):[cv2.IMWRITE_PNG_COMPRESSION, compression]
:compression
是压缩级别(0-9),默认值为 3,值越高压缩越强但速度越慢。
- 对于 WebP (
.webp
):[cv2.IMWRITE_WEBP_QUALITY, quality]
:quality
是压缩质量(0-100)。
- 对于 JPEG (
返回值
- 返回值为布尔值 (
True
或False
):True
: 保存成功。False
: 保存失败(如路径无效或无写权限)。
3 视频文件的读写与显示
对于图像文件,可以从其扩展名得知图像的格式,但是并不适用于视频文件,因为视频文件的格式主要由压缩算法决定;压缩算法称为编码器,解压算法成为解码器,编解码算法称为编解码器。
编解码器种类很多,主要由MJPG、XVID、DIVX等等。
3.1 视频读取
cv2.VideoCapture()
是 OpenCV 用于视频捕获和处理的函数,可以从视频文件、摄像头或视频流中获取帧数据。
cv2.VideoCapture(index, apiPreference=None)
参数说明
-
index
:- 如果要从摄像头捕获,
index
是摄像头设备的编号。- 通常,
0
代表默认摄像头,1
代表外接摄像头(如果有)。
- 通常,
- 如果要从文件读取,
index
是视频文件的路径(如'video.mp4'
)。
- 如果要从摄像头捕获,
-
apiPreference
(可选):- 指定视频捕获后端(API)的优先级,默认为
cv2.CAP_ANY
,OpenCV 会自动选择适当的后端。 - 常见的后端值:
cv2.CAP_ANY
:自动选择(默认)。cv2.CAP_V4L2
:用于 Linux 的 V4L2 接口。cv2.CAP_DSHOW
:DirectShow(Windows)。cv2.CAP_MSMF
:Windows Media Foundation。cv2.CAP_FFMPEG
:FFmpeg(跨平台,支持大部分格式)。
- 指定视频捕获后端(API)的优先级,默认为
返回值
- 返回一个
cv2.VideoCapture
对象,通过该对象可以捕获视频帧。
3.2 视频写入
cv2.VideoWriter()
是 OpenCV 用于将视频帧保存为视频文件的函数。通过这个函数,您可以将处理后的图像帧编码为视频并存储到磁盘。
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=True)
参数说明
-
filename
(str):- 视频输出文件的路径,包括文件名和扩展名。
- 扩展名决定了视频的编码格式(如
.avi
,.mp4
,.mkv
等)。
-
fourcc
(int):- 表示视频编码器的 4 字符代码 (FourCC)。
- 使用
cv2.VideoWriter_fourcc()
函数生成,例如:cv2.VideoWriter_fourcc(*'XVID')
:XVID 编解码器(常用于.avi
格式)。cv2.VideoWriter_fourcc(*'MP4V')
:MP4 编解码器(常用于.mp4
格式)。cv2.VideoWriter_fourcc(*'H264')
:H.264 编解码器(适用于高效压缩)。
- 不同系统和平台可能支持的编码器不同。
-
fps
(float):- 视频的帧率,即每秒的帧数。
- 例如,
30.0
表示 30 帧/秒。
-
frameSize
(tuple):- 视频帧的宽度和高度,格式为
(width, height)
。 - 所有传入帧的大小必须与此一致,否则会抛出错误。
- 视频帧的宽度和高度,格式为
-
isColor
(bool):- 指定视频是否为彩色。
- 默认为
True
(彩色),如果为False
,表示灰度视频。
返回值
- 返回一个
cv2.VideoWriter
对象,用于写入视频。