1,为了获取视频,你应该创建一个 VideoCapture 对象。他的参数可以是设备的索引号,或者是一个视频文件。设备索引号就是在指定要使用的摄像头。一般的笔记本电脑都有内置摄像头。所以参数就是 0。你可以通过设置成 1 或者其他的来选择别的摄像头。之后,你就可以一帧一帧的捕获视频了。但是最后,别忘了停止捕获视频。使用 ls /dev/video*命令可以查看摄像头设备
2,ret, frame = cap.read() 返回一个布尔值(True/False)。如果帧读取的是正确的,就是 True。所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。有时 cap 可能不能成功的初始化摄像头设备。这种情况下上面的代码会报错。你可以使用 cap.isOpened(),来检查是否成功初始化了。如果返回值是True,那就没有问题。否则就要使用函数 cap.open()。你可以使用函数 cap.get(propId) 来获得视频的一些参数信息。这里propId 可以是 0 到 18 之间的任何整数。每一个数代表视频的一个属性,见表其中的一些值可以使用cap.set(propId,value) 来修改,value 就是
你想要设置成的新值。例如,我可以使用 cap.get(3) 和 cap.get(4) 来查看每一帧的宽和高。默认情况下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320)和 ret=cap.set(4,240) 来把宽和高改成 320X240。
官方给出的set(self, propId, value)的函数的定义说明
def set(self, propId, value):
set(propId, value) -> retval
. @brief Sets a property in the VideoCapture.
. @param propId Property identifier from cv::VideoCaptureProperties (eg. cv::CAP_PROP_POS_MSEC, cv::CAP_PROP_POS_FRAMES, ...)
. or one from @ref videoio_flags_others
. @param value Value of the property.
. @return `true` if the property is supported by backend used by the VideoCapture instance.
. @note Even if it returns `true` this doesn't ensure that the property
. value has been accepted by the capture device. See note in VideoCapture::get()
从上面给出的定义说明,有些属性值设置成功之后,即使返回True
值,也不代表设置的属性值会被捕捉设备接收,详细参见:VideoCapture::get()
。我尝试设置摄像头的帧率,虽然返回True值,但是帧率并没有发生改变。
propld : property id
set(self, propId, value) 函数的定义,第一参数填写属性的id就是propId,当然也可以直接填写属性的全称例如,设置帧的宽度:
cap.set(3, 1080)
等价于
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1080)
第一中设置属性比较简单,第二种设置属性比较直观
set(self, propId, value)
: 对应的所有属性表如下:
参数 | propld | 功能 |
---|
cv2.CAP_PROP_POS_MSEC | 0 | 视频文件的当前位置(以毫秒为单位)或视频捕获时间戳 |
cv2.CAP_PROP_POS_FRAMES | 1 | 基于0的索引将被解码/捕获下一帧 |
cv2.CAP_PROP_POS_AVI_RATIO | 2 | 视频文件的相对位置:0 - 视频的开始,1 - 视频的结束 |
cv2.CAP_PROP_FRAME_WIDTH | 3 | 帧的宽度 |
cv2.CAP_PROP_FRAME_HEIGHT | 4 | 帧的高度 |
cv2.CAP_PROP_FPS | 5 | 帧速 |
cv2.CAP_PROP_FOURCC | 6 | 4个字符表示的视频编码器格式 |
cv2.CAP_PROP_FRAME_COUNT | 7 | 帧数 |
cv2.CAP_PROP_FORMAT | 8 | byretrieve()返回的Mat对象的格式 |
cv2.CAP_PROP_MODE | 9 | 指示当前捕获模式的后端特定值 |
cv2.CAP_PROP_BRIGHTNESS | 10 | 图像的亮度(仅适用于相机) |
cv2.CAP_PROP_CONTRAST | 11 | 图像对比度(仅适用于相机) |
cv2.CAP_PROP_SATURATION | 12 | 图像的饱和度(仅适用于相机) |
cv2.CAP_PROP_HUE | 13 | 图像的色相(仅适用于相机) |
cv2.CAP_PROP_GAIN | 14 | 图像的增益(仅适用于相机) |
cv2.CAP_PROP_EXPOSURE | 15 | 曝光(仅适用于相机) |
cv2.CAP_PROP_CONVERT_RGB | 16 | 表示图像是否应转换为RGB的布尔标志 |
cv2.CAP_PROP_WHITE_BALANCE | 17 | 目前不支持 |
cv2.CAP_PROP_RECTIFICATION | 18 | 立体摄像机的整流标志 |
get(self, propId)
:函数的作用是获取摄像头设置的相关属性值,官方给出的定义如下:
def get(self, propId):
get(propId) -> retval
. @brief Returns the specified VideoCapture property
. @param propId Property identifier from cv::VideoCaptureProperties (eg. cv::CAP_PROP_POS_MSEC, cv::CAP_PROP_POS_FRAMES, ...)
. or one from @ref videoio_flags_others
. @return Value for the specified property. Value 0 is returned when querying a property that is
. not supported by the backend used by the VideoCapture instance.
. @note Reading / writing properties involves many layers. Some unexpected result might happens
. along this chain.
. @code {.txt}
. `VideoCapture -> API Backend -> Operating System -> Device Driver -> Device Hardware`
. @endcode
. The returned value might be different from what really used by the device or it could be encoded
. using device dependent rules (eg. steps or percentage). Effective behaviour depends from device
. driver and API Backend
并非所有的参数都支持所有的摄像机 – 实际上,它们是OpenCV库中最麻烦的部分之一。每种摄像机类型 – 从android摄像机到usb摄像机到专业摄像机提供了一个不同的接口来设置其参数。并且在OpenCV代码中有许多分支来支持尽可能多的分支,但当然不是所有的可能性都被覆盖。
你可以做的是调查你的相机驱动程序,做一个补丁OpenCV,并发送到code.opencv.org。这样别人就会喜欢你的工作,就像你喜欢别人的一样。
Reference:
1、https://segmentfault.com/a/1190000015575701
2、https://blog.csdn.net/qq_31077649/article/details/75194719
3、http://zhaoxuhui.top/blog/2017/05/05/%E5%9F%BA%E4%BA%8EPython%E7%9A%84OpenCV%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%863.html
现在,我们已经获得了视频流的帧率,接下来需要修改它。为此,我们可以创建一个新的VideoWriter对象,并使用set()函数和CAP_PROP_FPS常量来设置新的帧率。请注意,如果您指定的帧率高于摄像头支持的帧率,则会自动降低帧率。我们可以使用while循环和read()函数来读取视频帧,并使用write()函数将它们写入新视频流中。接下来,我们需要获取视频流的帧率。请注意,如果您的摄像头不支持特定的帧率,则会返回默认帧率。在本篇文章中,我们将介绍如何使用Python编写代码来修改摄像头的帧率。
def stream_processing():
# 获取VideoCapture类实例,读取视频文件
fcap = cv2.VideoCapture('video_1.mp4')
# 设置摄像头分辨率的高
fcap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
# 设置摄像头分辨率的宽
fcap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
# 跳到某一感兴趣帧并从此帧
cap = cv2.VideoCapture(DJI_0008.MOV)
#cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
#fourcc = cv2.cv.FOURCC(*'XVID')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output1.avi', fourcc, 20, (1920, 1080))
num=0
while cap.isOpened():
# get a
在做基于视频的深度学习,需要对视频数据进行切割处理,刚敲了三行代码就卡在了如何获得视频属性的坎上,记录一下免得自己下次要用又忘记了。
先放上opencv2.4的官方文档链接
https://docs.opencv.org/2.4/index.html
下面是代码例子
import cv2
cap=cv2.VideoCapture(path)
frames_num=cap.get(7
# 修改视频帧率为指定帧率,分辨率保持不变
def modify_video_frame_rate(videoPath,destFps):
dir_name = os.path.dirname(videoPath)
basename = os.path.basename(vide...
目录 一、I、P、B 帧三种帧的说明 二、GOP(Group of picture)三、CABAC/CAVLC1.CABAC2. CAVLC四、DTS、PTS 的概念五、码流(码率)六、采样率七、音频采样率八、比特率常见编码模式 ==VBR(Variable Bitrate)动态比特率====ABR(Average Bitrate)平均比特率====CBR(Constant Bitrate)常数...
在测试alphapose时,原始视频的分辨率过高,导致网络难以运行,所以要修改视频的分辨率,代码如下:import cv2cap= cv2.VideoCapture("videl_1.mp4")videowriter= cv2.VideoWriter("videl_640_360"+".avi", cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 15, (6...
python 做视频后期单个视频转图片所有图片转视频视频压缩 - ffmpeg图片降低分辨率图像处理
这是最近无聊的想法,对视频进行处理,其实也就是对图片的处理。
对视频进行后期处理,思路就是,视频转图片,然后对图片进行处理,再把图片转视频。
图片处理的多么奇怪,视频就多么奇怪,我当时想了想觉得挺好玩就做了玩玩。
视频可能很大,对视频处理要花好长时间,所以还进行了视频压缩等操作。
用到的代码如下。
单个视频转图片
提取单个视频的所有帧
import cv2
import numpy as n