OpenCV代码示例
- OpenCV的视频教学:https://www.bilibili.com/video/BV14P411D7MH
1-OpenCV视频捕获
在 OpenCV 中,cv2.VideoCapture()
是一个用于捕获视频流的类。它可以用来从摄像头捕获实时视频,或者从视频文件中读取帧。以下是如何使用 cv2.VideoCapture()
实现视频捕获、设置捕获属性以及释放捕获对象的详细步骤。
1. 使用 cv2.VideoCapture()
捕获摄像头
import cv2
# 打开默认摄像头(通常是0)
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
while True:
# 读取一帧
ret, frame = cap.read()
# 检查是否成功读取帧
if not ret:
print("无法获取帧")
break
# 显示帧
cv2.imshow('Camera Feed', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
2. 使用 cv2.VideoCapture()
捕获视频文件
import cv2
# 打开视频文件
cap = cv2.VideoCapture('video.mp4')
if not cap.isOpened():
print("无法打开视频文件")
exit()
while True:
# 读取一帧
ret, frame = cap.read()
# 检查是否成功读取帧
if not ret:
print("视频结束或无法读取帧")
break
# 显示帧
cv2.imshow('Video Playback', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(30) & 0xFF == ord('q'):
break
# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
3. 设置视频捕获属性
OpenCV 允许你通过 cap.set()
方法来设置视频捕获的属性。常见的属性包括帧宽、帧高、帧率等。
import cv2
# 打开默认摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
# 设置帧宽和帧高
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# 设置帧率(每秒帧数)
cap.set(cv2.CAP_PROP_FPS, 30)
while True:
# 读取一帧
ret, frame = cap.read()
# 检查是否成功读取帧
if not ret:
print("无法获取帧")
break
# 显示帧
cv2.imshow('Camera Feed', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
4. 释放视频捕获对象
无论你是从摄像头还是视频文件捕获视频,在完成视频处理后,都应该释放 cv2.VideoCapture()
对象,并关闭所有打开的窗口。
cap.release()
cv2.destroyAllWindows()
总结
-
cv2.VideoCapture(0)
用于捕获摄像头视频。 -
cv2.VideoCapture('file.mp4')
用于捕获视频文件。 -
cap.set(propId, value)
用于设置视频捕获属性。 -
cap.release()
用于释放视频捕获对象。 -
cv2.destroyAllWindows()
用于关闭所有 OpenCV 窗口。
通过这些步骤,你可以在 OpenCV 中实现视频捕获、设置属性以及释放资源。
OpenCV视频写入
在 OpenCV 中,cv2.VideoWriter()
是一个用于将视频帧写入视频文件的类。你可以使用 cv2.VideoWriter()
将捕获到的帧写入到视频文件中。以下是如何使用 cv2.VideoWriter()
实现视频写入、设置写入参数、逐帧写入以及释放写入对象的详细步骤。
1. 使用 cv2.VideoWriter()
写入视频
首先,你需要创建一个 cv2.VideoWriter()
对象,并指定视频文件的输出路径、编解码器、帧率和帧大小。
import cv2
# 打开默认摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
# 获取帧的宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 定义输出视频文件的参数
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height))
while True:
# 读取一帧
ret, frame = cap.read()
# 检查是否成功读取帧
if not ret:
print("无法获取帧")
break
# 写入帧到视频文件
out.write(frame)
# 显示帧
cv2.imshow('Camera Feed', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放捕获对象和写入对象,并关闭所有窗口
cap.release()
out.release()
cv2.destroyAllWindows()
2. 设置视频写入参数
在创建 cv2.VideoWriter()
对象时,你需要设置以下参数:
- 文件名:输出视频文件的路径。
-
FourCC:编解码器,这是一个 4 字节的代码,表示视频编解码器。常用的编解码器包括:
-
cv2.VideoWriter_fourcc('M','J','P','G')
或cv2.VideoWriter_fourcc(*'MJPG')
表示 Motion JPEG。 -
cv2.VideoWriter_fourcc('X','V','I','D')
或cv2.VideoWriter_fourcc(*'XVID')
表示 XVID。
-
- 帧率:每秒帧数(FPS),通常设置为 30 或 25。
- 帧大小:视频的宽度和高度。
# 定义输出视频文件的参数
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height))
3. 逐帧写入视频
在读取每一帧后,你可以使用 out.write(frame)
将帧写入视频文件。
while True:
# 读取一帧
ret, frame = cap.read()
# 检查是否成功读取帧
if not ret:
print("无法获取帧")
break
# 写入帧到视频文件
out.write(frame)
# 显示帧
cv2.imshow('Camera Feed', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
4. 释放视频写入对象
在完成视频写入后,你应该释放 cv2.VideoCapture()
和 cv2.VideoWriter()
对象,并关闭所有打开的窗口。
# 释放捕获对象和写入对象,并关闭所有窗口
cap.release()
out.release()
cv2.destroyAllWindows()
总结
-
cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height))
用于创建视频写入对象。 -
out.write(frame)
用于逐帧写入视频。 -
out.release()
用于释放视频写入对象。 -
cap.release()
用于释放视频捕获对象。 -
cv2.destroyAllWindows()
用于关闭所有 OpenCV 窗口。
通过这些步骤,你可以在 OpenCV 中实现视频写入、设置参数、逐帧写入以及释放资源。
OpenCV视频帧处理
在 OpenCV 中,你可以逐帧读取视频帧,对这些帧进行处理,显示处理后的帧,并将处理后的帧保存到视频文件中。以下是如何实现这些功能的详细步骤。
1. 逐帧读取视频帧
使用 cv2.VideoCapture()
对象的 read()
方法逐帧读取视频帧。
import cv2
# 打开视频文件或摄像头
cap = cv2.VideoCapture('video.mp4') # 或者 cap = cv2.VideoCapture(0) 为摄像头
if not cap.isOpened():
print("无法打开视频文件或摄像头")
exit()
while True:
# 读取一帧
ret, frame = cap.read()
# 检查是否成功读取帧
if not ret:
print("无法获取帧或视频结束")
break
# 对帧进行处理
processed_frame = process_frame(frame)
# 显示处理后的帧
cv2.imshow('Processed Frame', processed_frame)
# 按下 'q' 键退出循环
if cv2.waitKey(30) & 0xFF == ord('q'):
break
# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
2. 处理视频帧
你可以对视频帧进行各种处理,例如滤波、增强、特征提取等。以下是一个简单的例子,对帧进行灰度处理。
def process_frame(frame):
# 将帧转换为灰度
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
return gray_frame
3. 显示视频帧
使用 cv2.imshow()
函数显示处理后的帧。
cv2.imshow('Processed Frame', processed_frame)
4. 保存处理后的视频帧
将处理后的帧写入一个新的视频文件。你需要创建一个 cv2.VideoWriter()
对象来实现这一点。
import cv2
# 打开视频文件或摄像头
cap = cv2.VideoCapture('video.mp4') # 或者 cap = cv2.VideoCapture(0) 为摄像头
if not cap.isOpened():
print("无法打开视频文件或摄像头")
exit()
# 获取原始帧的宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建 VideoWriter 对象
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, (frame_width, frame_height))
while True:
# 读取一帧
ret, frame = cap.read()
# 检查是否成功读取帧
if not ret:
print("无法获取帧或视频结束")
break
# 对帧进行处理
processed_frame = process_frame(frame)
# 显示处理后的帧
cv2.imshow('Processed Frame', processed_frame)
# 将处理后的帧写入视频文件
out.write(processed_frame)
# 按下 'q' 键退出循环
if cv2.waitKey(30) & 0xFF == ord('q'):
break
# 释放捕获对象和写入对象,并关闭所有窗口
cap.release()
out.release()
cv2.destroyAllWindows()
总结
- 使用
cv2.VideoCapture()
逐帧读取视频帧。 - 对每一帧进行处理,例如转换为灰度、应用滤波器等。
- 使用
cv2.imshow()
显示处理后的帧。 - 使用
cv2.VideoWriter()
将处理后的帧写入新的视频文件。
通过这些步骤,你可以在 OpenCV 中实现视频帧的逐帧读取、处理、显示和保存。