OpenCV中提供了一个基本的视频操作类VideoCapture,它是OpenCV用来通过摄像头、视频文件或图像序列来获取及操作视频的类。VideoCapture有两种读取视频的方法,分别是通过摄像头读取和通过视频文件读取。
(1)通过打开摄像头捕捉视频
# (1) 通过打开摄像头捕捉视频
import cv2
# 获取一个视频并打开
cap = cv2.VideoCapture(0) # 表示打开摄像头并创建摄像头对象
# 其中0表示打开内置摄像头,1表示打开外接摄像头
if cap.isOpened(): # VideoCapture对象是否成功打开
print('已经打开了摄像头捕捉视频')
else:
print('打开摄像头失败')
(2)通过打开视频文件读取视频
#(2)通过打开视频文件读取视频
import cv2
# 获取一个视频并打开
cap = cv2.VideoCapture('1.mp4')
if cap.isOpened():
print('已经打开了视频')
else:
print('视频文件打开失败')
(3)视频的分解
视频其实是由连续的图像画面组成的。当连续的图像变化每秒超过24帧画面以上时,根据视觉暂留原理,人眼就无法识别是否是静态画面了,这样平滑连续的视觉效果看起来就像是视频了。
帧率是以帧为单位的位图图像连续出现在显示器上的频率,通俗来说,就是1秒钟的帧(fps),也就是1秒钟展示的图像数量。
import os
import cv2
# 获取一个视频并打开
cap = cv2.VideoCapture('1.mp4')
if cap.isOpened():
print('已经打开了视频文件')
fps = cap.get(cv2.CAP_PROP_FPS) # 返回视频的fps--帧率
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # 返回视频的宽
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # 返回视频的高
print('fps:', fps, 'width:', width, 'height:', height)
i=0
while 1:
if i==15:
print('保存了视频的前15帧图像,保存结束')
break
else:
i = i+1
# ret 读取了数据就返回True,没有读取数据(已到尾部)就返回False
# frame 返回读取的视频数据--——帧数据
ret, frame = cap.read() # 读取一帧视频
file_name = 'img'+str(i)+'.jpg'
path = 'image'
# cv2.imwrite(file_name, frame) # 将图片写入当前路径下
# 将图像写入指定路径下
cv2.imwrite(os.path.join(path,file_name), frame)
else:
print('视频文件打开失败')
(4)图像读取
图像读取:在算法操作中,首先要获得图像,才能进行相关的算法操作,比如目标检测、人脸识别等。
import cv2
# 读取图片函数
def read_image(src):
# 使用opencv中的imread函数,读取图片
img = cv2.imread(src)
# 获取图片的宽度和高度
height, width = img.shape[0], img.shape[1]
print('image height is : '+str(height))
print('image width is :'+str(width))
# 很多时候图片长宽太大,屏幕显示不全
# 为了便于查看图片,将图片的大小缩放到某一尺寸,比如(500,600),即宽500像素,高600像素
img = cv2.resize(img, (500,600))
# 显示图片
cv2.imshow('Image', img)
# 显示图片停顿的时间,如果是0,则一直显示。如果是100,则显示100ms
cv2.waitKey(0)
img_path = 'person.png'
# 使用read_image函数,读取并显示图像
read_image(img_path)
(5)视频读取及跳帧处理
视频读取:视频是由一帧帧图像组成的(比如一秒25帧),但是在项目中,并不需要对所有的视频都进行读取处理,所以要学会跳帧操作(比如隔5帧使用一帧)。
import cv2
def cap_video(src):
# 使用openCV中的VideoCapture函数,读取视频
cap = cv2.VideoCapture(src)
# 初始化定义frame_id,便于后面跳帧
frame_id = 0
# 判断cap是否读取成功
while cap.isOpened():
# 因为视频采集,每秒可能会采集N帧,因此使用read函数,逐帧读取
# ret 返回True或False,表示是否读取到图片
ret, frame = cap.read()
# 当ret为False时,not ret为True,表示没有读取到图片,说明采集结束
if not ret:
# 打印输出,提示信息
print('Camera cap over')
continue
# frame_id加1,便于跳帧
frame_id += 1
# 如果frame除以2,不等于0,则不断循环,只有等于0时,才进行到下面的显示步骤,这样可以达到跳帧的效果
if not int(frame_id) % 2 == 0:
continue
# 便于观察,缩放图片,,比如(1000,800),即宽1000像素,高800像素
frame = cv2.resize(frame, (1000,800))
cv2.imshow('Image', frame)
cv2.waitKey(20)
cap_video('video.mp4')
(6)视频资源释放
cap = cv2.VideoCapture('video_test.mp4')
cap.release()
cv2.destroyAllWindows()
转载自:
https://www.cnblogs.com/liming19680104/p/12307654.html