实战:基于OpenCV进行长时间曝光(内含彩蛋)
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
在本文中,我们将学习长时间曝光摄影技术,以及如何使用Python和OpenCV(开源计算机视觉库)对其进行仿真。
一、什么是“长时间曝光“?
直接来自维基百科:
长时间曝光,时间曝光或慢速快门摄影涉及使用长时间快门速度来清晰地捕获图像的静止元素,同时使运动元素模糊。长时间曝光摄影可以捕捉到传统摄影无法捕捉到的一个元素:较长的时间。
因此,长时间曝光是一种出色的摄影技术,包括创建可显示时间效果的图像,这是普通摄影无法捕获的。对于初学者来说,这种技术并不容易,因为它需要一种有条理的方法来捕获图像。幸运的是,我们可以用图像处理来模拟这种技术。为此,我们可以使用一个视频(基本上是一系列图像)来计算基于所有视频帧的平均图像。
二、依赖库
在本教程中,我们将使用Python 3和OpenCV。我们将使用OpenCV,因为它是一个著名的开源计算机视觉库,其中提供了许多处理图像和视频的功能。在本教程中,我们将使用OpenCV来操纵视频及其帧。下图优雅地说明了为什么要使用Python:
此外,我们将使用其他两个Python软件包:
单击:提供命令行界面(CLI)。
tqdm:在终端上显示一个优雅的进度栏。
我们还将使用Pipenv轻松创建和管理虚拟环境。
三、环境
使用项目根目录中提供的Pipfile,我们可以使用Pipenv通过以下命令创建,安装依赖项并激活虚拟环境:
pip install pipenv # if not installed yet
pipenv install --dev
pipenv shell
四、代码
让我们开始看“入口点”。这是一个CLI命令,我们应该在其中传递一些参数:
video_path:本地计算机中视频的路径。
image_path:输出图像的路径和文件名。
step / -s(可选):用于获取帧的步骤。这是一个可选参数,默认值为1。
@cli.command()
@click.argument("video_path", nargs=1, type=str)
@click.argument("image_path", nargs=1, type=str)
@click.option("--step","-s",default=1,type=int,show_default=True,help="Step used to get the frames.",
)
def local_video(video_path, image_path, step):"""Apply the long exposure algorithm to a local video."""long_exposure = LongExposure(video_path, image_path, step)long_exposure()
它使用单击修饰符来提供漂亮的命令行界面。如果你们仍然不知道单击,我们建议你们看一下该程序包。这使我们可以像这样调用Python脚本:
python src/long_exposure.py local-video video.mp4 image.png -s 5
如果你们对如何使用有疑问,可以通过help标志来调用它:
python src/long_exposure.py --help
现在,让我们谈谈LongExposure类。这是项目的主类,它在其__init__中接收以下参数:
video:本地计算机中的视频路径。
output_image_path:必须在其中保存输出图像的路径/文件名。
step:用于忽略某些帧的步骤(默认为1)。这对于长视频非常有用。
class LongExposure:def __init__(self, video, output_image_path, step=1):self.video = videoself.output_image_path = output_image_pathself.step = step
平均器的方法仅仅是一个Clojure的是用来递增地计算平均图像,因为我们正在消耗视频帧逐个。
@staticmethoddef averager():"""Calculate the average using a clojure."""count = 0total = 0.0def average(value):nonlocal count, totalcount += 1total += valuereturn total / countreturn average
由于这是一个可调用的类,因此__call__方法是该类的主要方法,它主要负责:
加载视频;
通过视频帧进行迭代以计算平均图像(针对每个颜色通道);
合并颜色通道;以及
将映像保存在磁盘上。
def __call__(self):logging.info("Processing video %r with step %r", self.video, self.step)# Open a pointer to the video filestream = cv2.VideoCapture(self.video)# Get the total frames to be used by the progress bartotal_frames = int(stream.get(cv2.CAP_PROP_FRAME_COUNT))r, g, b = None, None, Noner_avg, g_avg, b_avg = self.averager(), self.averager(), self.averager()for count in tqdm(range(total_frames)):# Split the frame into its respective channels_, frame = stream.read()if count % self.step == 0:# Get the current RGBb_curr, g_curr, r_curr = cv2.split(frame.astype("float"))r, g, b = r_avg(r_curr), g_avg(g_curr), b_avg(b_curr)# Merge the RGB averages together and write the output image to diskavg = cv2.merge([b, g, r]).astype("uint8")logging.info("Saving image as %r", self.output_image_path)cv2.imwrite(self.output_image_path, avg)# Release the stream pointerstream.release()
请注意,cv2来自OpenCV,而tqdm(在循环中)仅用于显示进度条。如你们所见,这里没有魔术,代码非常简单,几乎可以自己解释。现在,让我们看看结果。
五、结果
我已使用以下YouTube视频应用长时间曝光效果:
推荐一波我好朋友的公众号:
我隐藏的这么深还是被幸运的你发现了,为了感谢各位小伙伴一直以来对小白的支持,我们决定发个百元红包(¥10*10),点击文字就可以来抽取!另外,不要忘了签到换书哦!
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
实战:基于OpenCV进行长时间曝光(内含彩蛋)相关推荐
- 实战:基于OpenCV进行长时间曝光
在本文中,我们将学习长时间曝光摄影技术,以及如何使用Python和OpenCV(开源计算机视觉库)对其进行仿真. 作者 | 小白 责编 | 欧阳姝黎 什么是"长时间曝光" ...
- NCF框架揭秘直播来了!红包、抽奖、还有神秘嘉宾…(内含彩蛋)
盛派周三技术分享会 直播开讲又来啦~ 为了更好地赋能开发者,盛派已将系统框架 SCF(SenparcCoreFramework)全部开源,收到了社区非常多的关注,现在 SCF 已正式更名为NCF(Ne ...
- matlab软件及基础实验第8单元,《MATLAB统计分析与应用:40个案例分析》程序与数据(内含彩蛋)...
[实例简介]Matlab教材及随书光盘,超实用的好书,强烈推荐! MATLAB统计分析与应用 40个案例分析.pdf <MATLAB统计分析与应用:40个案例分析>程序与数据.rar 第1 ...
- 实战 | 基于OpenCV的停车场空余车位实时监测系统(详细步骤 + 源码)
导 读 本文主要介绍如何使用Python和OpenCV实现一个停车场空余车位实时监测系统,并包含详细步骤和源码. 背景介绍 介绍实现步骤之前,先来看看测试视频(小型停车场实时监控画面): ,时长00 ...
- 表白技巧升级,大神程序员表白代码泄露(内含彩蛋)!
七夕快到了,表白素材赶紧先准备好... 1.委婉的表白 Python 代码: import string l = string.ascii_letters s = [] s.append(l[34]) ...
- 基于opencv tensorflow2.0开发的人脸识别锁定与解锁win10屏幕实战
基于opencv tensorflow2.0开发的人脸识别锁定与解锁win10屏幕实战 基于opencv tensorflow2.0开发的人脸识别锁定与解锁win10屏幕 前言 运行python环境 ...
- thinkcmf5调用指定分类的二级_Tengine快速上手系列教程amp;视频:基于Python API的图片分类应用入门丨附彩蛋...
前言:近期,Tengine团队加班加点,好消息接踵而来,OpenCV 4.3.0发布,OPEN AI LAB AIoT智能开发平台Tengine与OpenCV合作共同加速边缘智能,Tengine再获业 ...
- 实战:基于OpenCV实现偏斜文档校正
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|OpenCV学堂 纸质文档扫描中经常会发生扫描出来的图像有 ...
- 实战:基于OpenCV的人眼检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.背景 无论学习什么,实践都非常重要.如果打算学习OpenCV. ...
最新文章
- php中去空函数trim,PHP中trim()函数简单使用指南
- Celery 应用:Application
- Java并发编程-CountDownLatch
- 织梦php首页老是自动恢复,dede首页网址自动加上index.html问题解决方法
- 深入理解Java虚拟机04--类结构文件
- 配置BGP本地优先级
- python 正则的使用 —— 编写一个简易的计算器
- Javascript元编程创建DOM节点
- 第一次CM--CosH.2
- 提交页面插入到数据库2.jsp
- 为什么同事写的代码那么优雅~
- Visual Studio 2003/Visual Studio 2005常用快捷键(快捷方式)
- Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了
- 容器控件StackPanel控件
- 写入多个表_制作属于自己的教学工作表
- iOS开源App整理
- Oracle 修改表空间文件路径
- 带你几分钟学会MarkDown基本语法
- 菜菜的刷题日记 | 66.加一 Plus One
- 极坐标解圆锥曲线三角形面积范围问题
热门文章
- 科大讯飞“AI同传”造假背后的两个关键问题
- 手机AI、购物AI...还有哪个“AI+”被忽略了?
- 19张图带你梳理SpringCloud体系中的重要技术点!
- 通用的底层埋点都是怎么做的?
- 还在用Swagger生成接口文档?我推荐你试试它.....
- 怎么快速插入 100 条数据,用时最短
- Linus 谈 Git 的设计思想,顺带骂了一堆人(视频)
- Java 锁粗化与循环
- 尹伊:我眼中的Datawhale
- 张海腾:语音识别实践教程