读取视频

要捕获视频,需要创建一个VideoCapture对象。它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字,简单地传0(或-1)。可以传递1来选择第二个相机,以此类推。注意最后释放资源。

import cv2 as cv

# 从摄像头里读取
cap=cv.VideoCapture(0)
if not cap.isOpened():
    print("can't open camera")
    exit()
while True:
    # 读取帧
    ret,frame=cap.read()
    if not ret:
        print("can't receive frame (stream end?) .Exiting...")
        break
    # 颜色空间转换 
    gray=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
    cv.imshow('frame',frame)
    if cv.waitKey(1)==ord('q'):
        break
# 释放资源
cap.release()
# 销毁窗口
cv.destroyAllWindows()

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

cap可能尚未初始化捕获。在这种情况下,此代码显示错误。可以使用cap.isOpened()方法检查它是否已初始化。如果是True,那么确定。否则,使用cap.open()打开它。

cap.get(propId)访问视频的某些功能,其中0到18之间的一个数字。每个数字表示视频的属性。其中一些值可以使用cap.set(propId,value),value是新值。

可以通过width=int(cap.get(cv.CAP_PROP_FRAME_WIDTH))和height=int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))获取框架的宽度和高度。

fps=cap.get(cv.CAP_PROP_FPS)获取视频的帧率

fourcc=int(cap.get(cv.CAP_PROP_FOURCC)) 获取视频的编码

从文件播放视频

import cv2 as cv

cap=cv.VideoCapture('./video/xzg_684850.mp4')
while cap.isOpened():
    ret,frame=cap.read()
    if not ret:
        print("can't receive frame. Exitting...")
        break
    frame=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
    cv.imshow('video',frame)
    cv.waitKey(100)
    if cv.waitKey(1)&0XFF==ord('q'):
        break
cap.release()
cv.destroyAllWindows()

显示视频

从视频读取到一帧一帧的图像,然后使用cv.imread()显示。

保存视频

对于保存图像,直接使用cv.imwrite(filename,fourcc,fps,framesize,iscolor).

视频保存,需创建一个VideoWriter对象,指定视频的输出文件名,视频编码,帧率,视频框架大小,是否是彩色。

Fourcc:是用于指定视频编解码器的4字节代码,确定视频的编码格式

  • Fedora:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG会生成大尺寸的视频,X264会生成非常小的尺寸的视频)
  • Windows:DIVX
  • OSX:MJPG(.mp4),DIVX(.avi),X264(.mkv)

fourcc = cv.VideoWriter_fourcc(*'XVID')

import cv2 as cv
import os

cap=cv.VideoCapture(0)
width=int(cap.get(cv.CAP_PROP_FRAME_WIDTH))  # 获取框架宽度
height=int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)) #获取框架高度
fps=cap.get(cv.CAP_PROP_FPS) # 获取帧率
fourcc=int(cap.get(cv.CAP_PROP_FOURCC)) # 获取视频编码

writer=cv.VideoWriter('./video/output.mp4',fourcc,fps,(width,height))
n=0
while cap.isOpened():
    ret,frame=cap.read()
    if not ret:
        print("can't receive frame. Exitting...")
        break
    frame=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
    # 沿竖直方向翻转
    frame=cv.flip(frame,0)
    cv.imshow('img',frame)
    writer.write(frame) # 保存视频
    n+=1
    if n%100==0:
        imgpath=os.path.join('./images','%s.jpg' % n)
        cv.imwrite(imgpath,frame)  # 保存帧图像
    if cv.waitKey(1)&0XFF==ord('q'):
        break
writer.release()
cap.release()
cv.destroyAllWindows()

 

 posted on 2024-05-01 13:55  会飞的金鱼  阅读(16)  评论(0)    收藏  举报