网站建设平面要多少分辨率,怎么搭建一个视频网站,店标logo图片免费制作,网站可以做系统吗OpenCV提供了VideoCapture类和VideoWriter类来支持各种格式的视频流#xff0c;支持的格式类型会因系统的不同而有所变化#xff0c;但基本上都是支持avi格式的#xff0c;且对于视频文件和摄像头画面的读写所用到的接口基本上都相同#xff0c;因此#xff0c;我们把它们…OpenCV提供了VideoCapture类和VideoWriter类来支持各种格式的视频流支持的格式类型会因系统的不同而有所变化但基本上都是支持avi格式的且对于视频文件和摄像头画面的读写所用到的接口基本上都相同因此我们把它们放在一起来讲了。
1. 获取VideoCapture类实例
不管是读取视频文件还是捕获摄像头画面都使用到了VideoCapture类但不同的是传入的形参不一样如果我们传给VideoCapture类的是一个视频文件路径那么将是读取来自视频文件的画面而如果我们传给VideoCapture类的是摄像头编号那么将是读取来自摄像头的画面其使用示例如下
# 获取VideoCapture类实例读取视频文件
fcap cv2.VideoCapture(demo.mp4)
# 读取摄像头画面
ccap cv2.VideoCapture(0)
对于摄像头编号可以使用如下命令获取
ls -al /dev/ | grep video
对于输出信息以video开头的其数字后缀即为可能的摄像头编号如果一台电脑有多个摄像头设备那么将会出现从0开始的多个摄像头编号。
2. 判断获取VideoCapture实例是否成功
如果传入无效的视频文件或摄像头编号那么VideoCapture类将会在后续的read()接口返回FalseNone为了避免此类事件发生可以通过VideoCapture类的isOpened()接口进行判断该接口返回一个boolean值正常获取实例返回True否则返回False其使用示例如下
# 判断是否正确获取VideoCapture类实例
while fcap.isOpened():# next step operation
3. 获取视频流信息
一般视频流主要的帧信息包含画面宽高还有帧率对于视频文件则会多出整个视频流多少帧因此我们一般主要关注这四个视频流信息即可而我们用到的则是VideoCapture类的get接口其使用示例如下
# 获取视频帧的宽
w fcap.get(cv2.CAP_PROP_FRAME_WIDTH)
# 获取视频帧的高
h fcap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 获取视频帧的帧率
fps fcap.get(cv2.CAP_PROP_FPS)
获取到的帧率对于摄像头设备来说如果所使用的终端不支持查询那么将会返回0值且该值也不是非常精确的。
# 获取视频流的总帧数
fcount fcap.get(cv2.CAP_PROP_FRAME_COUNT)
注意这个是对视频文件才有意义对于摄像头是没意义的且以上获取到的返回信息均是浮点型的注意转换为整型。
4. 获取帧画面
这个就相对简单直接使用VideoCapture类的read接口即可该接口会返回两个参数第一个参数是读取成功与否标志位成功为True否则为False第二个参数则为具体的帧数据其是一个numpy.ndarray的数组其使用示例如下
# 获取帧画面
success, frame fcap.read()
但在读取过程中有可能会存在失败的情况出现一般我们是在第二次读取时放入一个while循环来保障整个读取顺利进行如下
# 判断读取视频流是否成功
while success:success, frame fcap.read()# do something in here
5. 针对一组或多头摄像头特殊处理
当需要同步一组摄像头或一个多头multihead摄像头例如立体摄像头或Kinect时read()方法就不太适用了这时一般使用grab()和retrieve()方法代替它。对于一组摄像头其使用示例如下
# 一组摄像头的特殊处理
success0 fcap0.grab()
success1 fcap1.grab()
if success0 and success1:frame0 fcap0.retrieve()frame1 fcap1.retrieve()
6. 跳到视频流某一帧
对于视频文件有时候我们需要直接跳到某一个感兴趣的帧并从该帧开始读取数据那么可以使用VideoCapture类的set接口其使用示例如下
# 跳到某一感兴趣帧并从此帧开始读取,如从第360帧开始读取
fcap.set(cv2.CAP_PROP_POS_FRAMES, 360)
success, frame fcap.read()
7. 设置摄像头分辨率
opencv读取到的摄像头画面大小一般为默认的640x480但这并不一定满足我们的日常使用要求比如摄像头支持超高清画面那么我们就希望能捕获到超高清1920x1080的画面好在VideoCapture类的set接口为我们提供了相应的功能其使用示例如下
# 设置摄像头分辨率的高
fcap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
# 设置摄像头分辨率的宽
fcap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
8. 获取VideoWriter类实例
不管是对视频文件的再存储还是对摄像头画面的保存都是用到了VideoWriter类且传入的形参意义是一致的都需要我们传入保存的文件名包含视频格式、指定视频编解码器、保存视频的帧率以及保存视频的分辨率一般来说保存视频的帧率最好与读入的画面的帧率一致但需要我们进行估计或使用计时器才会比较准确而分辨率则可以更改只是要求写入的帧其大小要与分辨率保持一致其使用示例如下
writer cv2.VideoWriter(output.avi, cv2.VideoWriter_fourcc(X, V, I, D), 30, (1080, 1920))
值得注意的是我们必须要为VideoWriter类的构造函数传入所需的参数且若指定的文件名已存在则会被直接覆盖。
9. VideoWriter类支持的视频编解码器
在构造VideoWriter类实例时我们必须要指定视频编解码器那么VideoWriter类都支持哪些视频编解码器呢我们通过cv2.VideoWriter_fourcc来指定具体使用的编解码器
I,4,2,0该选项是一个未压缩的YUV颜色编码兼容性好但产生文件较大文件扩展名为.avi
P,T,M,I该选项是MPEG-1编码类型文件扩展名为.avi
X,V,T,D该选项是MPEG-4编码类型得到的视频大小处于平均值文件扩展名为.avi
T,H,E,O该选项是Ogg Vorbis文件扩展名为.ogv
F,L,V,1该选项是一个flash视频文件扩展名为.flv
一般常用的是cv2.VideoWriter_fourcc(X,V,T,D)mp4编码文件相对小一些或cv2.VideoWriter_fourcc(I,4,2,0)文件相对大一些但为了缩小文件空间我们可能还需要用到ffmpeg工具进一步压缩文件。
10. 保存帧数据
这个也很简单直接使用VideoWriter类的write接口即可该接口一次可以保存一帧数据到制定文件中其使用示例如下
# 保存帧数据
writer.write(frame)
11. 释放资源
不管是VideoCapture类还是VideoWriter类当我们使用完了它们之后都应该将它们释放掉避免资源一直被占用而这两个类都有提供了release()接口给我们我们只需直接调用即可释放资源使用示例如下
# 释放VideoCapture资源
fcap.release()
# 释放VideoWriter资源
writer.release()
12. 一个完整的示例代码
# -*- coding: utf-8 -*-
# /usr/bin/env/python3use opencv3 to capture video frame, show and save its stream.import cv2def stream_processing():# 获取VideoCapture类实例读取视频文件fcap cv2.VideoCapture(demo.mp4)# 设置摄像头分辨率的高fcap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)# 设置摄像头分辨率的宽fcap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)# 跳到某一感兴趣帧并从此帧开始读取,如从第360帧开始读取fcap.set(cv2.CAP_PROP_POS_FRAMES, 360)# 获取视频帧的宽w fcap.get(cv2.CAP_PROP_FRAME_WIDTH)# 获取视频帧的高h fcap.get(cv2.CAP_PROP_FRAME_HEIGHT)# 获取视频帧的帧率fps fcap.get(cv2.CAP_PROP_FPS)# 获取视频流的总帧数fcount fcap.get(cv2.CAP_PROP_FRAME_COUNT)# 获取VideoWriter类实例writer cv2.VideoWriter(output.avi, cv2.VideoWriter_fourcc(X, V, I, D), int(fps), (int(w), int(h)))# 判断是否正确获取VideoCapture类实例while fcap.isOpened():# 获取帧画面success, frame fcap.read()while success:cv2.imshow(demo, frame) ## 显示画面# 获取帧画面success,frame fcap.read()# 保存帧数据writer.write(frame)if (cv2.waitKey(20) 0xff) ord(q): ## 等待20ms并判断是按“q”退出相当于帧率是50hz注意waitKey只能传入整数break# 释放VideoCapture资源fcap.release()# 释放VideoWriter资源writer.release()cv2.destroyAllWindows() ## 销毁所有opencv显示窗口if __name__ __main__:stream_processing() 好了以上就是opencv对视频文件和摄像头画面的读写操作了比较系统全面掌握了这些内容以后处理视频数据就会如鱼得水了