读取视频
要捕获视频,需要创建一个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
浙公网安备 33010602011771号