一、图像读取与显示

1.读取图像文件

image = cv2.imread(filename, flags=None)
参数
filename:图像文件的路径,可以是相对路径或绝对路径。
flags:读取图像的模式,可选参数。常用的标志包括:
cv2.IMREAD_COLOR(默认值):以彩色模式加载图像。如果图像是灰度图,加载后会转换为三通道图像。
cv2.IMREAD_GRAYSCALE:以灰度模式加载图像。加载后的图像是单通道的。
cv2.IMREAD_UNCHANGED:以原始格式加载图像,包括透明通道(如果有的话)。
返回值
返回值是一个 NumPy 数组,表示图像。如果文件不存在或无法读取,返回 None。

OpenCV 默认使用 BGR 格式,OpenCV支持的图像格式
JPEG:
文件扩展名:.jpg、.jpeg
用途:广泛用于照片和网络图像,支持有损压缩。
PNG:
文件扩展名:.png
用途:支持无损压缩,适合需要透明背景的图像。
BMP:
文件扩展名:.bmp
用途:Windows 位图格式,简单且无压缩,适合存储原始图像数据。
TIFF:
文件扩展名:.tiff、.tif
用途:广泛用于打印和图像编辑,支持多种颜色和数据类型。
GIF:
文件扩展名:.gif
用途:支持动画和简单的透明效果,适合网络图像。
WebP:
文件扩展名:.webp
用途:现代的图像格式,支持有损和无损压缩,适合网络图像。
RAW:
文件扩展名:.raw、.cr2(佳能)、.nef(尼康)等
用途:相机原始图像格式,保留了传感器捕获的原始数据。
PBM/PGM/PPM:
文件扩展名:.pbm(单色)、.pgm(灰度)、.ppm(彩色)
用途:简单的文本或二进制格式,适合存储基本图像数据。

2.显示图像

cv2.imshow(window_name, image)
参数
window_name:窗口的名称,必须是字符串。如果窗口已经存在,图像将显示在该窗口中;如果窗口不存在,将创建一个新的窗口。
image:要显示的图像,必须是 NumPy 数组。
返回值
该函数没有返回值。

cv2.imshow 只能显示 NumPy 数组格式的图像。如果图像不是 NumPy 数组,需要先将其转换为 NumPy 数组。

3.保存图像

cv2.imwrite(filename, image)
参数
filename:要保存的文件路径,包括文件名和扩展名。
image:要保存的图像,必须是 NumPy 数组。
返回值
返回一个布尔值,表示保存是否成功:
True:保存成功。
False:保存失败(例如路径无效或图像为空)。

该函数可以将图像保存为任意OpenCV支持的函数,例如:

# 保存为不同的格式
cv2.imwrite('output.png', image)  # 保存为 PNG
cv2.imwrite('output.bmp', image)  # 保存为 BMP
cv2.imwrite('output.tiff', image)  # 保存为 TIFF

4.等待键盘事件

key = cv2.waitKey(delay)
参数
delay:等待时间,以毫秒为单位。
如果 delay 为 0,则无限期等待,直到用户按下某个键。
如果 delay 为正整数(如 1、10、1000 等),则等待指定的时间(毫秒)。如果在这段时间内用户按下某个键,函数会返回该键的 ASCII 码值;否则返回 -1。
返回值
返回值是一个整数,表示按键的 ASCII 码值。
如果在指定时间内没有按键事件,返回 -1。
如果有按键事件,返回按键的 ASCII 码值。

该函数也可用于检测特定按键,例如:

if cv2.waitKey(1) & 0xFF == ord('q'):
    print("User pressed 's' key. Saving image...")
    cv2.imwrite('output.jpg', image)
    break
& 0xFF:通过用户按键返回的ASCII码和十六进制的0xFF(11111111)的按位与操作,确保返回值的范围在 0 到 255 之间(某些操作系统中需要)。
ord('q'):获取字符 'q' 的 ASCII 码值(113)。

5.关闭所有窗口

cv2.destroyAllWindows()

该函数用于关闭所有OpenCV打开的窗口,如果只想关闭特定窗口,可以使用cv2.destroyWindow(window_name),其中 window_name 是要关闭的窗口名称。

二、视频处理

6.读取视频

cap = cv2.VideoCapture(index_or_filename)
参数
index_or_filename:
如果是整数(如 0、1 等),表示摄像头的索引。例如,0 通常表示默认摄像头。
如果是字符串,表示视频文件的路径。
常用方法
cv2.VideoCapture 对象提供了多种方法来操作视频流,以下是一些常用方法:
cap.isOpened():
功能:检查视频流是否成功打开。
返回值:布尔值,True 表示成功打开,False 表示失败。
cap.read():
功能:读取视频流中的下一帧。
返回值:
ret:布尔值,表示是否成功读取帧。
frame:读取的帧,是一个 NumPy 数组。如果读取失败,frame 为 None。
cap.release():
功能:释放视频流资源。
说明:在使用完视频流后,必须调用此方法以释放资源。
cap.get(propId):
功能:获取视频流的属性。
参数:
propId:属性标识符,例如:
cv2.CAP_PROP_FRAME_WIDTH:帧宽度
cv2.CAP_PROP_FRAME_HEIGHT:帧高度
cv2.CAP_PROP_FPS:帧率
cv2.CAP_PROP_FRAME_COUNT:总帧数
返回值:属性值。
cap.set(propId, value):
功能:设置视频流的属性。
参数:
propId:属性标识符。
value:要设置的值。

该函数是OpenCV 中用于捕获视频的类,可以用于读取视频文件、图像序列或从摄像头捕获视频流。例如:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('example.mp4')

# 检查视频文件是否成功打开
if not cap.isOpened():
    print("Error: Unable to open video file.")
    exit()

# 获取视频属性
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)

print(f"Width: {width}, Height: {height}, FPS: {fps}, Frame Count: {frame_count}")

# 循环读取视频流
while True:
    ret, frame = cap.read()
    if not ret:
        print("Reached end of video.")
        break

    # 显示帧
    cv2.imshow('Video', frame)

    # 检测按键
    if cv2.waitKey(25) & 0xFF == ord('q'):
        print("User pressed 'q' key. Exiting...")
        break

# 释放资源并关闭窗口
cap.release()
cv2.destroyAllWindows()

7.保存视频

cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
参数
filename:保存视频的路径和文件名,字符串类型,例如 'output.mp4'。
fourcc:用于指定视频编码的 4 字符代码,例如 'mp4v',可以通过 cv2.VideoWriter_fourcc() 函数生成。
fps:视频的帧率,浮点型,表示每秒播放的帧数。
frameSize:视频帧的尺寸,以 (宽度, 高度) 的元组形式给出。
isColor(可选):布尔值,默认为 True,表示视频是彩色的;如果为 False,则表示视频是灰度的。
返回值
返回一个 cv2.VideoWriter 对象,用于写入视频文件

该函数是 OpenCV 中用于保存视频的核心类,支持从摄像头、视频文件或图像序列中读取视频流。例如:

import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)

# 检查摄像头是否打开成功
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 设置视频写入对象
output_path = 'camera_output.mp4'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
fps = 20
frame_size = (int(cap.get(3)), int(cap.get(4)))
out = cv2.VideoWriter(output_path, fourcc, fps, frame_size)

# 读取摄像头并保存视频
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    out.write(frame)
    cv2.imshow('frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()

print("视频保存完成")

三、颜色空间转换

8.颜色空间转换

dst = cv2.cvtColor(src, code)
参数
src:输入图像,必须是 NumPy 数组。
code:颜色空间转换的代码,指定从哪种颜色空间转换到哪种颜色空间。常见的代码包括:
cv2.COLOR_BGR2GRAY:从 BGR 转换到灰度。
cv2.COLOR_BGR2RGB:从 BGR 转换到 RGB。
cv2.COLOR_GRAY2BGR:从灰度转换到 BGR。
cv2.COLOR_BGR2HSV:从 BGR 转换到 HSV。
cv2.COLOR_HSV2BGR:从 HSV 转换到 BGR。
cv2.COLOR_BGR2LAB:从 BGR 转换到 LAB。
cv2.COLOR_LAB2BGR:从 LAB 转换到 BGR。
返回值
dst:转换后的图像,也是 NumPy 数组。

根据需要选择合适的目标颜色空间。例如,灰度图像适用于边缘检测,HSV 颜色空间适用于颜色分割。如果需要频繁进行颜色空间转换,可以考虑使用 GPU 加速(如 OpenCV 的 CUDA 模块)来提高性能。

9.将多通道图像拆分为单通道

channels = cv2.split(multi_channel_image)
参数
multi_channel_image:输入的多通道图像,例如 BGR 图像或 HSV 图像。
返回值
返回一个包含单通道图像的列表,每个通道是一个 NumPy 数组。

 如果只需要访问单个通道,可以直接通过 NumPy 索引访问,例如 image[:, :, 0] 用于访问蓝色通道。如果输入图像是灰度图像(单通道),cv2.split 仍然适用,但它会返回一个包含单个通道的数组。

10.将多个单通道图像合并成多通道

multi_channel_image = cv2.merge(channels)
参数
channels:一个包含单通道图像的列表,每个通道是一个 NumPy 数组。这些通道必须具有相同的尺寸和数据类型。
返回值
返回一个多通道图像,是一个 NumPy 数组。

OpenCV 默认使用 BGR 格式,而不是 RGB 格式。因此,当你使用 cv2.merge 时,确保通道顺序正确。所有通道必须具有相同的尺寸和数据类型。如果通道的尺寸或类型不匹配,cv2.merge 会抛出错误。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐