您的位置 首页 php

OpenCV-Python教程002——视频的读取、显示和保存

目标: 学习读取视频,显示视频和保存视频。学习从相机捕捉并显示它。你将学习以下功能:cv.VideoCapture(),cv.VideoWriter().

(1)从相机中读取视频

通常情况下,我们必须用摄像机捕捉实时画面。提供了一个非常简单的界面。让我们从摄像头捕捉一段视频,将其显示出来。

要捕获视频,你需要创建一个VideoCapture对象。它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接,所以简单地传0(或-1)。你可以通过传递1来选择第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放VideoCapture对象,并销毁播放窗口。

读取摄像头,并播放视频的代码如下:

 #读取和播放摄像头
import cv2
cap = cv2.VideoCapture(0)   #生成VideoCapture对象实例,捕获摄像头
if not cap.isOpened():      #未能正确捕获摄像头,退出
    print("Cannot open camera")
    exit()
while True:                 #无限循环,读取和播放摄像头
    ret, frame = cap.read() #逐帧读取
    # 如果正确读取帧,ret为True
    if not ret:             #如果未能正确读取帧,退出
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # 此处是在帧frame上的操作
    # 显示结果帧
    cv2.imshow('myvideo', frame)
    if cv2.waitKey(1) & 0xFF== 27: #按ESC退出,&0xFF确保获得正确的8位ASCII码(低8位)
        break
cap.release()          #完成所有操作后,释放VideoCapture对象
cv2.destroyAllWindows() #销毁视频播放窗口   

捕获的摄像头视频播放窗口如下:

cap.read()返回布尔值(True/ False)。如果正确读取了帧,它将为True。因此,你可以通过检查此返回值来检查视频的结尾(播放完毕后将返回False)。

有时,cap可能尚未初始化捕获。在这种情况下,此代码显示错误。你可以通过cap.isOpened()方法检查它是否已初始化。如果是True,那么摄像头或视频文件已打开。否则,使用cap.open()打开它。

你还可以使用cap.get(propId)方法访问该视频的某些功能,其中propId是0到18之间的一个数字。每个数字表示视频的属性(如果适用于该视频),并且可以显示完整的详细信息。在这里看到:cv::VideoCapture::get()。其中一些值可以使用cap.set(propId,value)进行修改。value是你想要的新值。

例如,可以通过cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)获取帧的宽度和高度。如果想改变分辨率,如修改为320×240。只需使用cap.set()方法即可。例如:

ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)

ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240).

(2)从文件播放视频

它与从相机捕获相同,只是用视频文件名更改摄像机索引。另外,在显示帧时,请使用适当的时间cv.waitKey(),以响应键盘事件,如退出、保存帧、保存视频片段等。从文件播放视频的代码如下:

 #读取和播放视频文件
import cv2
cap = cv2.VideoCapture(r'D:\python_opencv\videos\my_video.mp4')
n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))#获取视频的帧数
print('视频文件的帧数量为:',n_frames)
fps = cap.get(cv2.CAP_PROP_FPS)
print('视频文件的帧率为:',fps)
frame_width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f'视频文件帧的尺寸为:宽度 {frame_width},高度 {frame_height}')
while cap.isOpened():
    ret, frame = cap.read()
    # 如果正确读取帧,ret为True
    if not ret: #如果未能正确读取帧,警告提示,退出
        print("Can't receive frame (stream end?). Exiting ...")
        break
    #原始视频文件分辨率太高,进行压缩后播放显示
    frame = cv2.resize(frame, (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)/3),
                               int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)/3)))
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == 27: #按ESC退出
        break
cap.release()
cv2.destroyAllWindows()  

输出结果为:

 视频文件的帧数量为: 910
视频文件的帧率为: 29.7378170263708
视频文件帧的尺寸为:宽度 1080,高度 1920  

播放的视频文件截图为:

(3)保存视频帧

使用VideoCapture对象捕捉一个视频,一帧一帧地处理。要想保存帧为图像文件,非常简单,只需使用 cv2.imwrite()方法即可。从视频文件提取一个帧并保存的代码如下:

 #读取视频文件,保存一帧图像
import cv2
cap = cv2.VideoCapture(r'D:\python_opencv\videos\my_video.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    # 如果正确读取帧,ret为True
    if not ret: #如果未能正确读取帧,警告提示,退出
        print("Can't receive frame (stream end?). Exiting ...")
        break
    #原始视频文件分辨率太高,进行压缩后播放显示
    frame = cv2.resize(frame, (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)/3),
                               int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)/3)))
    cv2.imshow('frame', frame)
    if cv2.waitKey(25) & 0xFF == ord('s'): #按s键保存一帧图像
        cv2.imwrite('D:/python_opencv/images/captured_image.jpg',frame)
    if cv2.waitKey(25) & 0xFF == 27: #按ESC退出
        break
cap.release()
cv2.destroyAllWindows()   

当然,可以设置不同的条件,保存多帧图像。

(4)保存视频

想要保存视频,还需要做一些工作。

保存视频需要首先创建一个VideoWriter对象,指定输出文件名,然后指定 FourCC 代码(详见下一段),然后传递帧率的数量和帧大小。最后一个是颜色标志。如果为 True,编码器期望颜色帧,否则它与灰度帧一起工作。

FourCC: 是用于指定视频编解码器的4字节代码。FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,是一种独立标示视频数据流格式的四字符代码。

可用代码列表可在fourcc.org中:找到。它取决于平台。保存视频需要遵循编解码器。

视频播放软件通过查询 FourCC 代码并且寻找与 FourCC 代码相关联的视频解码器来播放特定的视频流。比如: XVID=XviD MPEG-4 codec。

在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2(最好使用XVID,MJPG会生成大尺寸的视频,X264会生成非常小的尺寸的视频)。

在Windows中:DIVX(尚待测试和添加)

在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。

FourCC代码作为MJPG的cv2.VideoWriter_fourcc(’M’,’J’,’P’,’G’)或cv2.VideoWriter_fourcc(*’MJPG’)传递。

VideoWriter()方法的格式如下:

VideoWriter(filename, fourcc, fps, frameSize[, isColor])

filename:要保存的文件的全路径名称,包括后缀。

fourcc:指定编码器。

fps:要保存的视频的帧率。

frameSize:要保存的文件的画面尺寸(width, height)。

isColor:指示是黑白画面还是彩色的画面。

从摄像机捕获视频并保存的代码如下所示:

 #读取摄像头,保存一段视频
import cv2
cap = cv2.VideoCapture(0)
# 定义编解码器并创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(r'D:\python_opencv\videos\output_video.mp4', fourcc, 20.0, (640,  480))
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    #frame = cv2.flip(frame, 0)
    # 写翻转的框架
    out.write(frame)
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == 27: #按ESC退出
        break
# 完成工作后释放VideoCapture对象,VideoWriter对象,销毁播放窗口
cap.release()
out.release()
cv2.destroyAllWindows()   

视频保存后在计算机文件资源管理器的截图为:

视频保存完后记得释放VideoWriter对象。

文章来源:智云一二三科技

文章标题:OpenCV-Python教程002——视频的读取、显示和保存

文章地址:https://www.zhihuclub.com/154321.shtml

关于作者: 智云科技

热门文章

网站地图