目标
- 学习读取视频,显示视频和保存视频。 学习从相机捕捉并显示它。
- cv.VideoCapture(),cv.VideoWriter() 从相机中读取视频
从相机中读取视频
通常情况下,我们必须用摄像机捕捉实时画面。提供了一个非常简单的界面。让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来。只是一个简单的任务开始。
要捕获视频,需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。
设备索引就是指定哪个摄像头的数字。。所以我简单地传0(或-1)。你可以通过传递1来选择第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放俘虏。
import cv2 as cv # 导入cv2模块,并简写为cv,这是OpenCV的Python接口
cap = cv.VideoCapture(0) # 创建一个VideoCapture对象,参数0表示使用计算机的默认摄像头
if not cap.isOpened(): # 检查摄像头是否成功打开
print("break") # 如果摄像头没有打开,打印"break"(这里的信息可能不够明确,通常我们会打印更具体的错误信息)
exit() # 退出程序
while(1): # 创建一个无限循环,用于不断读取摄像头捕获的帧
ret, frame = cap.read() # 从摄像头读取一帧,ret是一个布尔值,表示是否成功读取到帧;frame是读取到的帧图像
if not ret: # 如果读取帧失败
print("error") # 打印错误信息
break # 跳出循环
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 将读取到的彩色帧图像转换为灰度图像
cv.imshow("window", gray) # 在名为"window"的窗口中显示灰度图像
if cv.waitKey(1) == ord(' '): # 等待1毫秒看是否有键盘输入,如果有且是空格键(' '),则执行if语句内的代码
break # 跳出循环,结束视频捕获和显示
cap.release() # 释放VideoCapture对象,即关闭摄像头
cv.destroyAllWindows() # 销毁所有OpenCV创建的窗口
cap.read()
第一个参数返回布尔值(True/ False)。如果正确读取了帧,它将为True。因此,你可以通过检查此返回值来检查视频的结尾。
第二个参数返回读取视频的值
我可以通过
cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)
检查框架的宽度和高度。默认情况下,它的分辨率为640x480。但我想将其修改为320x240。只需使用和即可。
从文件播放视频
它与从相机捕获相同,只是用视频文件名更改摄像机索引。另外,在显示框架时,请使用适当的时间cv.waitKey()。如果太小,则视频将非常快,而如果太大,则视频将变得很慢(嗯,这就是显示慢动作的方式)。正常情况下25毫秒就可以了。
import cv2 as cv # 导入cv2模块,并简称为cv,用于处理图像和视频
# 使用cv2的VideoCapture函数打开视频文件
cap = cv.VideoCapture('./video/test1.avi')
# 检查视频是否成功打开
if not cap.isOpened():
print("failed") # 如果视频文件未成功打开,则打印失败信息
exit() # 并退出程序
# 无限循环,直到视频结束或用户按下空格键
while 1:
ret, frame = cap.read() # 读取一帧视频
# 如果ret为False,说明视频已结束或读取出错
if not ret:
print("视频已经结束") # 打印视频结束信息
break # 跳出循环
# 将读取到的BGR格式的帧转换为灰度图像
img = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 显示灰度图像
cv.imshow("img", img)
# 等待15毫秒,如果在此期间用户按下任意键,则检测是否按下空格键
# ord(" ")获取空格键的ASCII码值,如果用户按下空格键,则break跳出循环
if cv.waitKey(15) == ord(" "):
break
# 释放视频捕捉资源
cap.release()
# 销毁所有OpenCV创建的窗口
cv.destroyAllWindows()
保存视频
我们捕捉一个视频,一帧一帧地处理,我们想要保存这个视频。对于图像,它非常简单,只需使用 cv.imwrite()。但对于图像则比较麻烦。
首先创建一个 VideoWriter 对象。我们应该指定输出文件名(例如: output.avi)。然后我们应该指定 FourCC 代码(详见下一段)。然后传递帧率的数量和帧大小。最后一个是颜色标志。如果为 True,编码器期望颜色帧,否则它与灰度帧一起工作。
FourCC: 是用于指定视频编解码器的4字节代码。
# 导入必要的库
import numpy as np # 导入NumPy库,主要用于数组和矩阵运算
import cv2 as cv # 导入OpenCV库,并简写为cv,它是计算机视觉和图像处理的主要库
# 创建VideoCapture对象,参数0通常表示计算机的默认摄像头
cap = cv.VideoCapture(0)
# 定义视频编解码器并创建VideoWriter对象
# fourcc是一个4字节码,用于指定视频的编解码器。这里使用'XVID'
fourcc = cv.VideoWriter_fourcc(*'XVID')
# 创建VideoWriter对象,参数依次为输出文件名、编解码器、帧率、帧大小
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
# 读取摄像头的视频流,直到视频结束
while cap.isOpened():
# 从摄像头读取一帧
ret, frame = cap.read()
# 如果ret为False,说明读取失败或视频结束
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# 翻转图像(在垂直方向上),这里第二个参数为0表示沿x轴翻转
frame = cv.flip(frame, 1)
# 将翻转后的帧写入到输出视频文件中
out.write(frame)
# 显示当前帧
cv.imshow('frame', frame)
# 等待1毫秒,如果按下'q'键,则退出循环
if cv.waitKey(1) == ord('q'):
break
# 释放VideoCapture对象
cap.release()
# 释放VideoWriter对象
out.release()
# 销毁所有OpenCV创建的窗口
cv.destroyAllWindows()
在创建VideoWriter对象时,需要指定输出视频的帧率(这里是20.0帧/秒)和帧大小(这里是640x480像素)。这些参数应与摄像头捕获的帧的帧率和大小相匹配,或者根据需要进行调整。
标签:视频,入门,frame,cap,笔记,OPENCV,cv,摄像头,读取 From: https://blog.csdn.net/zsy54577/article/details/140148965