如何使用OpenCV和Python實作攝影中常見的長曝光效果
該任務可簡單實作攝影中的長曝光效果。
什麼是長曝光?
長曝光是攝影中的一種技術,當采用這項技術之後,流水、雲朵可以像絲綢一般柔順、汽車的軌迹照亮整條公路、星星伴随着地球的旋轉呈現圓形的軌迹,進而在圖像中呈現出時間流逝的美感。
具體的效果如下圖所示:左圖為視訊序列(流動的水),右圖為長曝光效果圖

代碼如下所示:
#coding:utf-8
#*********************************************************************************************************
'''
說明:利用python/opencv實作攝影中的圖像長曝光
算法思路:
1)讀取視訊圖像,将每一幀圖像進行通道分離;
2)采用簡單的平均思想,對序列幀進行處理;
3)合并處理後分離的三通道圖像;
'''
import cv2
import numpy as np
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", required=True,help="path to input video file")
args = vars(ap.parse_args())
if __name__ == '__main__':
print( '[INFO] 讀取視訊流......' )
cap = cv2.VideoCapture( args['video'] )
num = 0
( ravg, gavg, bavg ) = ( None, None, None )
while True:
while ( num < 300 ):#隻處理本地視訊的前300幀,因為後續視訊與目前場景不同
#你可以根據自己的視訊選擇
ret, frame = cap.read()
print( num )
if not ret:
print(' 視訊流讀取失敗或讀取完成 ')
break
#圖檔通道分離
cv2.imshow( 'frame', frame )
cv2.waitKey( 20 )
( B, G, R ) = cv2.split( frame )
if ravg is None:
ravg, gavg, bavg = R, G, B
else:
ravg = ( R + num * ravg ) / ( num + 1 )
gavg = ( G + num * gavg ) / ( num + 1 )
bavg = ( B + num * bavg ) / ( num + 1 )
num += 1
#通道合并為長曝光圖像
long_exposure_img = cv2.merge( [ bavg, gavg, ravg ] ).astype( 'uint8' )
cv2.imshow( 'Long_exposure', long_exposure_img )
cv2.waitKey( 0 )
參考連結:Adrian Rosebrock大神
https://www.pyimagesearch.com/2017/08/14/long-exposure-with-opencv-and-python/