机器学习opencv之读视频文件,显示视频文件以及如何保存视频文件
摘要:cap=cv2.VideoCapture(0)。cap=cv2.VideoCapture(0)。
我们经常使用摄像头捕获实时图像。OpenCV提供了一个 常简单的接口。我们使用摄像头来捕获一段并把它换成灰度显示出来。
我们应该使用方法VideoCapture(参数),这个参数是我们计算机上摄像头的索引号,从0开始,一般笔记本都有内置摄像头,如果不想用内置的可以设置成1,或者2等等,一般我们使用其它的设置成0
这个方法可以返回一个VideoCapture对象,我们可以通过该对象的方法来读取视频
方法讲解
cap.isOpened()来检查是摄像头否成功初始化了。如果回值是True就没有。否则就使用函数cap.open()。如果没有初始化成功执行其它代码会出错
cap.read() 返回一个布尔值True/False。如果帧取的是正确的就是True。所以可以检查通过它的返回值来查看文件是否已经到了结尾。
cap.get(propId) 来获得的一些参数信息。 propId 可以是 0 到 18 之的任何整数。每一个数代表一个属性比如
cap.get(3)和cap.get(4)来查看每一帧的宽和,默认情况下得到的值是640X480。
但是我可以使用 cap.set(propId,value) 来修改比如:
ret=cap.set(3,320) 和 ret=cap.set(4,240) 来把宽和改成 320X240
代码演示
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)把frame图片灰色处理
# -*- coding: utf-8 -*-
import numpy as np
import cv2
cap=cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
解释cap.read会返回两个参数:所以必须ret,frame这样写
第一个参数ret的值为True或False,代表有没有读到图片
第二个参数是frame,是当前截取一帧的图片。
cv2.cvtColor(frame,参数)为设置这个窗口的颜色
cap.release()为释放摄像头
这个整个程序的运行流程是这样的,摄像头获取的视频在我们其实就是由一帧一帧的图片构成,我们cap.read读取每一帧,然后显示,这样一直读取一直显示,就完成了显示视频的作用了
将读取到的视频存储到文件中
# -*- coding: utf-8 -*-
import numpy as np
import cv2
cap=cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
out = cv2.VideoWriter('output.avi', fourcc, 10.0, (frame_width, frame_height))
while (cap.isOpened()):
ret, frame = cap.read()
if ret == True:
#frame = cv2.flip(frame, 0)
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
代码解析
cv2.VideoWriter_fourcc('M','J','P','G')为获取FourCC,它是一个一种独立标识视频数据流格式的四字符代码,视频播放软件通过查询 FourCC 代码并且寻找与 FourCC 代码相关联的视频解码器来播放特定的视频流。常见的FourCC码有:DIVX,XVID,MJPG,X264,WMV1,WMV2,比如:fourcc = cv2.VideoWriter_fourcc(*'XVID'),在本机xvid无法成功,而mjpg成功,mjpg是最保险的一个
我们将读取的一张图片写入只需要imwrite,而写入视频需要费事一些,他需要VideoWriter对象,这个对象创建的时候需要四个参数:
第一个:指定输出文件的格式及名称(例如:output.avi,这个不固定)
第二个:FourCC码
第三个:每秒帧数(FPS)
第四个:应该传递帧的大小
获取对象out最后可以write(窗口),这样就将视频写到了文件中了
frame = cv2.flip(frame, 0)被注释了,这方法的意思是对帧进行翻转,就是说摄像头录的视频相当于是上下反的
out.write(frame)
cv2.imshow('frame', frame)
一边写入,一边显示,让我们看清摄像头究竟在录什么