opencv18视频操作
Posted Enzo 想砸电脑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv18视频操作相关的知识,希望对你有一定的参考价值。
目录
- 一、视频基础
- 二、摄像头初始化 / 视频文件初始化
- 三、检查摄像头/视频文件、打开摄像头/视频文件
- 四、播放视频文件(捕获帧)
- 五、关闭摄像头 / 释放摄像头
- 六、获取属性、设置属性
- 七、保存视频
- 八、视频基础操作
例子中用到的视频:点击查看
一、视频基础
1、视频:视频是由一帧一帧的图像组成的。当连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频
2、视频处理:从视频中抽取出独立的帧(图像),使用图像处理的方法处理对其进行处理,以达到处理视频的目的。
3、帧速率:1秒内所出现的帧数,单位为:帧/秒,英文为 FPS (Frames Per Second)
二、摄像头初始化 / 视频文件初始化
cv2.VideoCapture() 函数既可以完成摄像头的初始化,也能用于视频文件的初始化
场景1、使用摄像头
cap = cv2.VideoCapture(摄像头ID号) # 初始化摄像头
参数 “摄像头ID号”:摄像设备(摄像头)的 ID 编号,默认值为 -1,表示随机选取一个摄像头。
- 如果有多个摄像头,则用数字 “0”, “1” 等表示
- 如果只有一个摄像头,既可以使用“0”也可以使用“-1” 作为摄像头ID号
返回值 “cap”:cv2.VideoCapture 类的对象
场景2、使用视频文件
cap = cv2.VideoCapture(“文件名”) # 初始化视频文件
三、检查摄像头/视频文件、打开摄像头/视频文件
一般情况下,使用 cv2.VideoCapture() 函数即可完成摄像头的初始化,有时为了防止初始化发生错误,可以使用 cv2.VideoCapture.isOpened() 函数来检查初始化是否成功。
return_value = cv2.VideoCapture.isOpened()
返回值 “return_value”:布尔值,若为 Ture,初始化成功; 为False,初始化不成功
如果摄像头初始化失败,可以使用函数 cv2.VideoCapture.open() 打开摄像头,
retval = cv2.VideoCapture.open(index) # index:摄像头ID号
retval = cv2.VideoCapture.open(“filename”) # filename:文件名
四、播放视频文件(捕获帧)
摄像头初始化成功后,就可以从摄像头中捕获帧信息了,然后我们连续的展示捕获到的帧图像,就好像是在连续的播放视频
return_value, image = cv2.VideoCapture.read()
返回值:
return_value:是否捕获成功。捕获成功值为True, 不成功为 False
image:捕获到的帧
五、关闭摄像头 / 释放摄像头
cap.release()
举例
import cv2
cap = cv2.VideoCapture(0) # 使用摄像头
# cap = cv2.VideoCapture('traffic.avi') # 使用视频文件
while cap.isOpened():
ret, frame = cap.read()
cv2.imshow('frame', gray)
if cv2.waitKey(1) == 27: # ESC键
break
cap.release()
cv2.destroyAllWindows()
六、获取属性、设置属性
获取属性
return_value = cv2.VideoCapture.get(propId) # propId 属性参数
设置属性
return_value = cv2.VideoCapture.get(propId) # propId 属性参数
属性枚举值:官方文档点击查看
举例:查看帧的高度与宽度
import cv2
cap = cv2.VideoCapture('traffic.avi') # 使用视频文件
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # 获取帧的宽度
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # 获取帧的高度
print(width)
print(height)
while cap.isOpened():
ret, frame = cap.read()
cv2.imshow('frame', frame)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
举例:检测摄像头的帧率
import cv2
import time
cap = cv2.VideoCapture(0)
t = 0.1
counter = 0
fps = 0
start_time = time.time()
while (True):
ret, frame = cap.read()
# 测帧率
counter += 1
if (time.time() - start_time) > t:
fps = counter / (time.time() - start_time)
fps = str(fps)
counter = 0
start_time = time.time()
cv2.putText(frame, "FPS 0".format(fps), (10, 30), 1, 1.5, (255, 0, 255), 2)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
七、保存视频
保存视频的三个步骤: (1)创建对象 (2)写入视频 (3)释放对象
# 1、创建对象
(filename, fourcc, fps, frameSize, isColor)
# 2、写入视频
out.write(frame) # 帧图片要求是BGR格式
# 3、释放对象
out.release()
构造函数 cv2.VideoWriter
用来创建对象 ,实现初始化工作
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
参数:
- filename:视频的存放路径和文件名,如果文件名已经存在,则覆盖这个文件
- fourcc:视频编码/解码类型(格式)
opencv中用函数cv2.VideoWriter_fourcc()来指定视频编码格式,该函数有4个字符参数,这4个字符参数构成了编码器/解码器的4字标记,每个编码器都有一个这样的标记;
|
下面列出几个常用的标记:
(1)cv2.VideoWriter fourcc(‘I’, ‘4’, ‘2’, ‘0’)表示未压缩的 YUV 颜色编码格式,色度子采样为4:2:0。该编码格式具有较好的兼容性,但产生的文件较大,文件扩展名为.avi(2)cv2 VideoWriter fourcc(‘P’, ‘I’, ‘M’, ‘I’)表示 MPEG-1编码类型,生成的文件的扩展名
为.avi(3)cv2.VideoWriter fourcc(‘X’, ‘V’, ‘I’, ‘D’)表示MPEG-4 编码类型。如果希望得到的视频大小为平均值,可以选用这个参数组合。该组合生成的文件的扩展名为.avi
(4)·cv2.VideoWriter fourcc(‘T’, ‘H’, ‘E’, ‘O’)表示OggVorbis编码类型,文件的扩展名为.ogv
(5)cv2.VideoWriter fourcc(‘F’, ‘L’, ‘V’, ‘I’)表示 Flash 视频,生成的文件的扩展名为.fly
- fps:frames per second 帧速率
- frameSize:每一帧的长和宽
- isColor:表示是否为彩色图像, 默认为 True
通常写法举例:
cv2.VideoWriter("output.avi", fourcc=-1, fps=20, frameSize=(1024, 768), isColor=True)
举例
import cv2
cap = cv2.VideoCapture('traffic.avi')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
out = cv2.VideoWriter('flip.avi', fourcc, 30, (int(width), int(height)), True)
while cap.isOpened():
ret, frame = cap.read()
if ret==True:
flip_frame = cv2.flip(frame, 0)
out.write(flip_frame)
cv2.imshow("flip_frame", flip_frame)
if cv2.waitKey(1)==27:
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
八、视频基础操作
import cv2
cap = cv2.VideoCapture('traffic.avi') # 使用视频文件
while cap.isOpened():
ret, frame = cap.read()
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
result = cv2.flip(gray, 0)
cv2.imshow('result image', result)
if cv2.waitKey(1) == 27:
break
else:
break
cap.release()
cv2.destroyAllWindows()
import cv2
cap = cv2.VideoCapture(0) # 使用摄像头
while cap.isOpened():
ret, frame = cap.read()
img = cv2.Canny(frame, 100, 200)
cv2.imshow('img', img)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
以上是关于opencv18视频操作的主要内容,如果未能解决你的问题,请参考以下文章