文章目录
- 环境搭建
- 所有相关接口验证demo以上传至仓库
- 窗口相关接口
- 图片相关接口
- 视频/摄像头相关接口
-
- 显示视频:cv2.VideoCapture
-
- [VideoCapture 类的主要方法](#VideoCapture 类的主要方法)
-
- 检查设备是否成功打开:isOpened()
- 捕获下一帧:read()
- 获取视频流的某个属性:get()
- [设置视频流的某个属性: set(propId, value)](#设置视频流的某个属性: set(propId, value))
- 关闭视频流并释放资源:release()
- 录制视频
-
- 指定视频编解码器的四字符代码:cv2.videowriter_fourcc
- [创建videoWriter对象: cv2.VideoWriter](#创建videoWriter对象: cv2.VideoWriter)
- 写入帧:out.write()
环境搭建
开发环境基于python3.6, opencv-python版本为3.4.1.15
使用conda安装OpenCV开发环境
- 创建虚拟环境
Shell
conda create -n opencv36 python=3.6
- 激活虚拟环境
Shell
conda activate opencv36
- 安装opencv
Shell
pip install opencv-python==3.4.1.15
pip install opencv-contrib-python==3.4.1.15
所有相关接口验证demo以上传至仓库
代码地址:https://gitee.com/norep/learn-opencv
窗口相关接口
创建窗口:cv2.namedWindow
Python
cv2.namedWindow("My Window", cv2.WINDOW_NORMAL)
参数说明:
-
窗口名称:窗口的标题。它是一个字符串,用于标识窗口
-
窗口属性(可选参数) :
窗口属性(可选参数) :
-
cv2.WINDOW_NORMAL:这个标志表示窗口是可调整大小的。
-
cv2.WINDOW_AUTOSIZE:这个标志表示窗口大小会自动调整为与显示的图像大小相匹配,用户不能手动调整大小。
-
cv2.WINDOW_FREERATIO:这个标志表示窗口可以自由缩放。
-
cv2.WINDOW_KEEPRATIO:这个标志表示窗口在缩放时保持图像的宽高比。
-
cv2.WINDOW_GUI_EXPANDED:这个标志表示窗口有GUI扩展功能。
调整窗口大小:cv2.resizeWindow
Python
cv2.resizeWindow("My Window", 640, 480)
参数说明:
-
窗口名称:这是之前使用 cv2.namedWindow 创建的窗口的标题。它是一个字符串,用于标识要调整大小的窗口。
-
宽度:这是你希望设置的新窗口的宽度,以像素为单位。
-
高度:这是你希望设置的新窗口的高度,以像素为单位。
显示图像:cv2.imshow
Python
cv2.imshow("My Image", image)
参数说明:
- 窗口名称:这是之前使用 cv2.namedWindow 创建的窗口的标题。它是一个字符串,用于标识要显示图像的窗口。
- 图像:这是你要显示的图像。它应该是一个 NumPy 数组,通常是使用 OpenCV 函数读取的图像数据。
注意:
如果在调用 cv2.imshow 之前没有创建窗口(使用 cv2.namedWindow),OpenCV 会自动创建一个窗口。但是,如果想要设置窗口的属性,比如可调整大小,需要在显示图像之前显式地创建窗口。
必须要与cv2.waitKey函数配套调用,如果不调用 cv2.waitKey,可能会造成窗口无响应或崩溃
等待输入:cv2.waitKey
用于在显示图像后暂停程序的执行,等待用户输入
Python
cv2.waitKey(0) # 等待无限期,直到有键被按下
# 或者
cv2.waitKey(1000) # 等待1000毫秒(1秒)
参数说明:
- 延迟时间:这是函数等待按键输入的时间,以毫秒为单位。如果这个值是正数,函数将等待这么多毫秒或者直到有按键被按下。如果这个值是 0,函数将无限期地等待按键输入。如果这个值是负数,函数将立即返回,不等待任何按键。
返回值:
- 按键的 ASCII 码,以便根据用户按下的键执行不同的操作。
销毁所有窗口:cv2.destroyAllWindows
用于关闭所有先前由 OpenCV 创建的窗口,并销毁与这些窗口相关的所有资源。
Python
cv2.destroyAllWindows()
销毁指定窗口:cv2.destroyWindow
Python
cv2.destroyWindow('Window Name') # 关闭指定名称的窗口
参数说明:
- 窗口名称:这是之前使用 cv2.namedWindow 创建的窗口的标题。
注意:
cv2.destroyAllWindows 和 cv2.destroyWindow 只会影响 OpenCV 创建的窗口
图片相关接口
读取图像:cv2.imread
用于从文件中读取图像。这个函数非常基础且常用,是处理图像时的第一步。读取的图象是BGR格式。
Python
image = cv2.imread(filename, flags)
参数说明:
-
filename:一个字符串,表示要读取的图像文件的路径。这个路径可以是相对路径或绝对路径。
-
flags(可选) :这是一个可选参数,用于指定如何读取图像。
常用的flags包括:
-
cv2.IMREAD_COLOR:加载彩色图像。任何图像的透明度将被忽略。
-
cv2.IMREAD_GRAYSCALE:以灰度模式加载图像。
-
cv2.IMREAD_UNCHANGED:包括图像的alpha通道加载图像。也就是说,加载图像的同时保留图像的透明度。
保存一个图像:cv2.imwrite
用于将图像保存到文件中
Python
result = cv2.imwrite(filename, image)
参数说明:
-
filename:一个字符串,表示要保存的图像文件的路径。这个路径可以是相对路径或绝对路径。文件扩展名决定了图像的保存格式,例如 .jpg、.png、.bmp 等。
-
image:一个 NumPy 多维数组,通常是通过 OpenCV 的其他函数处理过的图像数据。数组的数据类型和形状取决于图像的通道数和深度。
返回值:
-
如果函数成功保存图像,它会返回 True。
-
如果无法保存图像(例如,文件无法写入,权限不足,格式不支持等),函数会返回 False。
注意:
保存图像时,OpenCV 默认使用 BGR 格式,而不是常见的 RGB 格式。这意味着红色和蓝色通道在数组中是交换的。如果你有一个 RGB 格式的图像数组,你需要先使用 cv2.cvtColor 函数将其转换为 BGR 格式,然后再保存。
视频/摄像头相关接口
显示视频:cv2.VideoCapture
是 OpenCV 库中的一个类,用于从视频文件或摄像头捕获视频流。
Python
cap = cv2.VideoCapture(filename_or_index)
参数说明:
- filename_or_index:如果是一个字符串,它表示视频文件的路径。如果是一个整数,它表示摄像头的索引号(通常0表示第一个摄像头)。
返回值:
- VideoCapture 对象
VideoCapture 类的主要方法
检查设备是否成功打开:isOpened()
用于检查视频捕获设备(如摄像头或视频文件)是否成功打开。这个方法返回一个布尔值,如果视频捕获设备成功打开,则返回 True,否则返回 False。
捕获下一帧:read()
Python
ret, frame = cap.read()
返回值:
- 返回一个布尔值和一个帧。如果读取成功,返回 True 和当前的帧;如果读取失败或到达视频末尾,返回 False 和一个空帧。
获取视频流的某个属性:get()
Python
get(propId)
# example:
# width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
参数说明:
- propId 是属性的标识符:
常用属性:
-
cv2.CV_CAP_PROP_POS_MSEC:返回当前视频帧的位置,单位为毫秒。
-
cv2.CV_CAP_PROP_POS_FRAMES:返回当前视频帧的位置,单位为帧数。
-
cv2.CV_CAP_PROP_POS_AVI_RATIO:返回当前视频帧的位置,单位为视频文件的总长度的比例。
-
cv2.CV_CAP_PROP_FRAME_WIDTH:返回视频流的宽度。
-
cv2.CV_CAP_PROP_FRAME_HEIGHT:返回视频流的高度。
-
cv2.CV_CAP_PROP_FPS:返回视频流的帧率。
-
cv2.CV_CAP_PROP_FOURCC:返回视频流的四字符代码(Four-CC)。
-
cv2.CV_CAP_PROP_FRAME_COUNT:返回视频文件中的总帧数。
设置视频流的某个属性: set(propId, value)
Python
set(propId, value)
同上
关闭视频流并释放资源:release()
Python
cap.release()
注意:
在使用 VideoCapture 对象后,应该调用 release() 方法来释放资源,特别是在使用摄像头时。
read() 方法可能会因为各种原因失败,比如文件不存在、权限问题或设备问题。因此,每次调用 read() 后都应该检查返回的布尔值。
如果视频文件或摄像头的帧率很高,可能需要使用 cv2.waitKey 来控制帧的显示速度,以避免视频播放过快。
录制视频
指定视频编解码器的四字符代码:cv2.videowriter_fourcc
四字符代码是由四个字符组成的字符串,这些字符代表了特定的编解码器。不同的编解码器支持不同的视频格式和压缩选项。
Python
fourcc = cv2.VideoWriter_fourcc(*'XVID')
参数说明:
-
一些常见的四字符代码包括:
-
DIVX:用于 DivX 编解码器
-
XVID:用于 Xvid 编解码器
-
H264:用于 H.264 编解码器
-
MJPG:用于 Motion JPEG 编解码器
-
MP4V:用于 MPEG-4 编解码器
创建videoWriter对象: cv2.VideoWriter
OpenCV 库中的一个类,用于将视频序列写入文件。这个类允许你以不同的编解码器和格式保存视频文件。要使用 VideoWriter 类,你需要创建一个 VideoWriter 对象,然后不断地向它写入帧,最后释放对象以关闭视频文件。
Python
out = cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
参数说明:
-
filename:一个字符串,表示要写入的视频文件的路径。文件扩展名决定了视频的保存格式,例如 .avi、.mp4、.mkv 等。
-
fourcc:一个表示视频编解码器的四字符代码,通常通过 cv2.VideoWriter_fourcc 函数获取。例如,cv2.VideoWriter_fourcc(*'XVID') 表示使用 Xvid 编解码器。
-
fps:一个整数或浮点数,表示视频的帧率(每秒帧数)。
-
frameSize:一个元组 (width, height),表示视频帧的大小。
-
isColor(可选):一个布尔值,指示写入的视频是否为彩色。如果为 True,则视频为彩色;如果为 False,则视频为灰度。默认值为 True。
返回值:
-
videoWriter对象
-
如果创建失败,则返回 None。
注意:四字符代码的选择取决于你的系统和安装的编解码器。如果你选择的编解码器不受支持,VideoWriter 对象的创建可能会失败。
写入帧:out.write()
在完成视频写入后,务必调用 release() 方法来释放资源并正确关闭视频文件。
Python
out.write(frame)
参数说明:
-
frame :应该是一个 NumPy 数组,代表要写入的视频帧。这个数组的形状和类型必须与创建 VideoWriter 对象时指定的帧大小和颜色模式相匹配。
-
如果 frame 的形状或类型与预期的不同,out.write(frame) 可能会导致错误或写入的视频文件无法正常播放。
返回值:
- 如果在写入过程中出现错误,out.write(frame) 可能会返回 False。因此,在实际应用中,你可能需要检查返回值并相应地处理错误。