目录
例子中用到的视频:点击查看
对应视频讲解:https://www.bilibili.com/video/BV1pG41177AC/?vd_source=35cf519a89c1804afbe62a7ac4cf26dd
1、视频:视频是由一帧一帧的图像组成的。当连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频
2、视频处理:从视频中抽取出独立的帧(图像),使用图像处理的方法处理对其进行处理,以达到处理视频的目的。
3、帧速率:1秒内所出现的帧数,单位为:帧/秒,英文为 FPS (Frames Per Second)
cv2.VideoCapture() 函数既可以完成摄像头的初始化,也能用于视频文件的初始化
cap = cv2.VideoCapture(摄像头ID号) # 初始化摄像头
参数 “摄像头ID号”:摄像设备(摄像头)的 ID 编号,默认值为 -1,表示随机选取一个摄像头。
返回值 “cap”:cv2.VideoCapture 类的对象
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.set(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、创建对象
out = cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
# 2、写入视频
out.write(frame) # 帧图片要求是BGR格式
# 3、释放对象
out.release()
构造函数 cv2.VideoWriter 用来创建对象 ,实现初始化工作
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
参数:
cv.VideoWriter_fourcc('M','J','P','G') or cv.VideoWriter_fourcc(*'MJPG')这两种参数的写法都可以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
1、在Windows中:DIVX(尚待测试和添加)
2、在OSX中的使用:MJPG(.mp4),DIVX(.avi),X264(.mkv)
3、在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。
(最好使用XVID。MJPG会生成大尺寸的视频。X264会生成非常小的尺寸的视频)
*** Fedora 是一个操作系统,我都不知道还有这个操作系统…
通常写法举例:
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()
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
大家好!我对我的:username字段进行了一个小的验证,它应该是4到30个字符。我写了一个验证::length=>{:within=>4..30,:message=>I18n.t('activerecord.errors.range')-我想显示一个错误各种错误的消息(不像,太长或太短),但这里有一个问题-我可以将最小值和最大值都传递给翻译,以便有类似的东西:用户名应该在4到30个字符之间。目前我有:range:"shouldbebetween%{count}and%{count}characters",这显然不起作用(只是为了检查)。是否可以从范围中获取这些值?谢谢大家的指教!
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?