缅甸小猛拉网址_缅甸小猛拉网址摄影爱好者玩编程:利用Python和OpenCV打造专业级长时曝光摄影

中国围棋网2017年10月11日 04时10分58秒
62

原标题:教程 | 摄影爱好者玩编程:利用Python和OpenCV打造专业级长时曝光摄影图

机器之心编译

参与:乾树、蒋思源

在本文中,我们将学习如何使用 OpenCV 和图像处理技术来模拟长时曝光图像。为了模拟长时曝光,我们采用了对一组图像取平均值的帧平均法。机器之心对该教程进行了简要的介绍。



长时曝光是摄影师最喜欢的摄影技术之一,运用长时曝光技术可以拍出展示时光流逝的图片,而这是传统技术难以企及的。我们经常使用这种技术表达流光夜景或柔顺的流水。优秀的长时曝光作品是摄影师对快门速度、光圈大小和 ISO 感光度的完美把控,那么我们如何使用 Python 和 OpenCV 库来实现这种长时曝光的效果呢?

使用长时曝光技术后,水流变得如丝般光滑,夜空中的星星也随着地球的旋转留下一道光线轨迹,车头/尾灯成为了一束光带。

长时曝光技术效果酷炫,但为了拍到这种类型的镜头,我们需要学习一些系统方法:把相机放在三脚架上,应用各种滤镜,计算曝光值等。更不用说,我们需要成为一名熟练的摄影师!

作为一名计算机视觉研究员和程序员,本文作者知道很多关于图像处理的知识。虽然他是个菜鸟摄影师,但有一种通过应用多帧图像平均法来模拟长时曝光效果的方法。通过计算在特定时间内拍摄的图像的平均值,我们可以(有效)模拟长时间曝光效果。

而且由于视频实际上是一系列的图像,我们可以通过计算视频中的所有帧的平均值来实现长时曝光效果。如此得到的是令人惊叹的长时曝光效果。


用 OpenCV 和 Python 实现长时曝光效果

这篇文章分为三部分。在本文的第一部分,我们将讨论如何通过帧平均法来模拟长时间曝光效果。随后我们将编写为输入视频创建长时曝光效果的 Python 和 OpenCV 代码。最后,我们将在一些样例视频上使用我们的代码,以创建酷炫的长时曝光图像。

通过多帧图像平均法模拟长时曝光效果

通过平均数模拟长时曝光的想法由来已久。事实上,如果我们去浏览热门的摄影网站,就会找到有关如何使用相机和三脚架手动实现这类效果的教程。

我们今天的目标是简单地实现这种方法,所以我们使用 Python 和 OpenCV 自动为输入视频创建长时曝光效果的图像。给定一个输入视频,我们将计算所有帧的平均值(加权平均)以创建长时曝光效果。

注意:我们也可以使用多个连续图像创建这种长时曝光效果,但是由于视频的实质是一系列图像,因此使用视频演示此技术更容易。在将此技术应用到自定义图像时,请牢记这一点。我们看到,代码并不复杂,并且在应用于使用三脚架捕获的视频时(不要抖动相机)效果很好。

OpenCV 实现模拟长时曝光效果

我们首先创建一个名为 long_exposure.py 的新文件,然后插入以下代码:


# import the necessary packagesimport argparseimport imutilsimport cv2 # construct the argument parse and parse the argumentsap = argparse.ArgumentParser() ap.add_argument("-v", "--video", required=True, help="path to input video file") ap.add_argument("-o", "--output", required=True, help="path to output'long exposure'") args = vars(ap.parse_args())


2-4 行导入软件包,因此我们需要预先安装 Imutils 和 opencv。如果你没有安装 imutils 模块,可以通过 pip 安装:

$ pip install --upgrade imutils

如果你的电脑没有安装配置 OpenCV,那么请自行搜索 OpenCV 3 的安装教程,并选择适合你系统的安装方式。

我们在 7-12 行解析命令行参数。

  • --video : 视频文件目录路径

  • --output : 输出「长时曝光」图像的路径+文件名

  • 接下来执行一些初始化步骤:


    # initialize the Red, Green, and Blue channel averages, along with# the total number of frames read from the file (rAvg, gAvg, bAvg) = (None, None, None) total = 0
    # open a pointer to the video file print("[INFO] opening video file pointer...") stream = cv2.VideoCapture(args["video"]) print("[INFO] computing frame averages (this will take awhile)...")


    我们在第 16 行初始化 RGB 通道平均值,稍后会将其合并到最终的长时曝光图像中。我们还初始化了第 17 行的总帧数。

    对于本教程,我们正在使用包含所有帧的视频文件,因此有必要在 21 行创建一个捕获视频流的文件指针。

    现在我们进入计算平均值的循环语句中:


    # loop over frames from the video file streamwhile True: # grab the frame from the file stream (grabbed, frame) = stream.read() # if the frame was not grabbed, then we have # reached the end of the sfile
    if not grabbed:
    break # otherwise, split the frmae into its respective channels (B, G, R) = cv2.split(frame.astype("float"))

    在循环语句中,我们将从流中捕获帧(27 行),并将帧各自分解到对应的 BGR 通道变量(35 行)。请注意循环语句退出条件 :如果未从视频文件流的末尾抓取帧,我们将退出循环(31 行和 32 行)。

    我们将在循环语句的其它部分执行平均值计算:


    # if the frame averages are None, initialize them
    if rAvg is None: rAvg = R bAvg = B gAvg = G # otherwise, compute the weighted average between the history of # frames and the current frames
    else: rAvg = ((total * rAvg) + (1 * R)) / (total + 1.0) gAvg = ((total * gAvg) + (1 * G)) / (total + 1.0) bAvg = ((total * bAvg) + (1 * B)) / (total + 1.0) # increment the total number of frames read thus far total += 1


    如果这是第一次迭代,我们在第 38-41 行上将 RGB 的初始平均值设置为抓取的第一帧的通道值(if 语句仅在第一次迭代时执行此操作)。

    否则,我们将计算 45-48 行上抓取的图像每个通道的平均值。平均值计算非常简单,我们将总帧数乘以通道平均值,加上相应的通道,然后将该结果除以浮点型总帧数(我们将分母总数加一,因为生成的是一个新帧)。我们将计算结果存储在相应的 RGB 通道平均值数组中。

    最后,我们增加总帧数,以便能够保持运行时平均值(第 51 行)。一旦我们遍历完视频文件中的所有帧,我们就可以将(平均)通道值合并成一个新图像并将其写入磁盘:


    标签:缅甸小猛拉网址,缅甸小猛拉网址官网,缅甸小猛拉网址娱乐

    本文链接:http://www.weiqi.cc/developer/116646.html 转载请注明出处