python-opencv学习笔记(三)

简介:

Opencv提供了VideoCapture类和VideoWriter类来支持各种格式的视频文件。在到达视频文件末尾之前VideoCapture类可以通过read()函数来获取新的帧,每一帧是一幅BGR格式的图像。
可将一幅传递给VideoWriter类的write()函数,该函数会将这幅图像加到VideoWriter类所指向的文件中下面是一个例子,读取MP4文件,并采用YUV颜色编码将其写入另一帧中:

import cv2
videoCapture=cv2.VideoCapture('myvid.mp4')
fps=videoCapture.get(cv2.CAP_PROP_FPS)
size=(int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
      int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter=cv2.VideoWriter(
    'MyOutPut.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size
)
success,frame=videoCapture.read()
while success:
    videoWriter.write(frame)
    success,frame=videoCapture.read()

要注意:必须要为VideoWriter类的构造函数指定视频文件名,这个文件名对应的文件若存在,会被覆盖。也必须指定视频编解码器。编解码器的可能性根据系统不同而不同:

  • cv2.VideoWriter_fourcc(‘I’,‘4’,‘2’,‘0’):该选项是一个未压缩的YUV颜色编码,是4:2:0色度子采集。这种编码兼容性较好,但文件较大,扩展名为.avi
  • cv2.VideoWriter_foucc('P','I','M','I'):该选项是MPEG-1编码类型,扩展名为.avi
  • cv2.VideoWriter_foucc('X','V','I','D'):该选项是MPEG-4编码类型,如果希望得到的视频大小为平均值,推荐使用此选项,文件扩展名.avi
  • cv2.VideoWriter_foucc('T','H','E','O'):该选项Ogg Vorbis,文件扩展名应为.ogv。
  • cv2.VideoWriter_foucc('F','L','V','I'):该选项是一个Flash视频,文件扩展名应为.flv
    帧速率和帧大小也应该指定,因为需要从另一个视频复制视频帧,这些属性可以通过VideoCapture类的get()函数得到。

捕获摄像头帧:
VideoCapture类可以获得摄像头的帧流。但对摄像头而言,通常不是用视频的文件名来构造VideoCapture类,而是需要传递摄像头的设备索引(device index)。

import cv2
cameraCapture=cv2.VideoCapture(0)
fps=30
size=(int (cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
      int (cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter=cv2.VideoWriter(
    'MyOutPutVid.avi',cv2.VideoWriter_fourcc('I','4','2','0'),
    fps,size
)
success,frame=cameraCapture.read()
numFramesRemaining=10*fps-1
while success and numFramesRemaining>0:
    videoWriter.write(frame)
    success,frame=cameraCapture.read()
    numFramesRemaining -=1
cameraCapture.release()

但VideoCapture类的get()方法不能返回摄像头速率的准确值,总是返回0。
为了针对摄像头创建合适的VideoWriter类,要么对帧数率做出假设,要么使用计时器来测量,后一种更加好一些。
摄像头的数目和顺序系统决定。但OpenCV没有提供任何查询摄像头数目和属性的方法。如果使用无效索引构造了VideoCapture类,就不会得到帧,VideoCapture的read()函数会返回(false,None)。为了不让read()函数从没有正确打开的VideoCapture类中获取数据,可在执行该函数之后使用VideoCa.isOpened方法一个判断,该方法返回一个Boolean值。
当需要同步一组摄像头或多头(multihead)摄像头(例如立体摄像头或kinect)时,read()不合适,可用grab()和retrive()代替,可使用以下代码:

success0=cameraCaputer0.grad()
success1=cameraCapture1.grad()
if success0 and success1:
  frame0=cameraCapture0.retrive()
  frame1=cameraCapture1.retrive()

timg

目录
相关文章
|
6天前
|
存储 C语言 Python
【Python】学习笔记day3
【Python】学习笔记day3
29 1
|
6天前
|
存储 计算机视觉 异构计算
使用python&C++对bubbliiiing的yolo系列进行opencv.dnn进行推理部署
使用python&C++对bubbliiiing的yolo系列进行opencv.dnn进行推理部署
40 0
|
6天前
|
算法 API 计算机视觉
[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)
[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)
31 0
|
6天前
|
分布式计算 Python
Python函数式编程学习笔记
高阶函数是能接收另一个函数作为参数的函数,如Python的map()、reduce()和filter()。map()将传入的函数应用到序列每个元素并返回迭代器,如将整数列表转换为字符串列表。reduce()对序列进行累积计算,例如求和。filter()根据给定函数返回的真值保留或丢弃序列元素,常用于筛选。sorted()函数支持自定义排序,如按绝对值或ASCII值排序。此外,还包括返回函数、匿名函数(lambda)、装饰器(用于动态增强函数功能)和偏函数(partial),用于固定函数部分参数,简化调用。
9 1
|
6天前
|
前端开发 安全 JavaScript
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
|
6天前
|
计算机视觉 Python
【Python实战】——Python+Opencv是实现车牌自动识别
【Python实战】——Python+Opencv是实现车牌自动识别
|
6天前
|
算法 Serverless 计算机视觉
使用OpenCV和Python进行极线校正
使用OpenCV和Python进行极线校正
16 1
|
6天前
|
机器学习/深度学习 算法 自动驾驶
opencv python 图片叠加
【4月更文挑战第17天】
|
6天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
6天前
|
存储 数据库 数据安全/隐私保护
基于Django的Python应用——学习笔记
基于Django的Python应用——学习笔记