使用Python,OpenCV实现简单的场景边界/拍摄转换检测器
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV实现简单的场景边界/拍摄转换检测器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Python,OpenCV進行簡單的場景邊界/拍攝轉換檢測器
- 1. 效果圖
- 2. 實現
- 2.1 步驟
- 2.2 什么是“場景邊界”和“拍攝過渡”?
- 2.3 代碼目錄結構
- 2. 源碼
- 參考
這篇博客起源于朋友分享蝙蝠俠7更新了,而我沒有辦法去最近的書店買書。于是下載了電子書,電子書已經實現了左擊或者右擊自動縮放、滾動。
然而我想自己通過計算機視覺的技術實現——自動從數字漫畫中提取每個面板,縮放滾動等;
核心是場景邊界檢測算法,這篇博客將用100行代碼實現此算法;
這篇博客介紹了如何使用OpenCV實現簡單場景邊界檢測算法,并將該算法應用于數字漫畫書籍,自動提取了漫畫書的每個單獨面板。您也可以使用您自己的視頻。
1. 效果圖
原始視頻幀 VS Mask VS 截取的動畫幀
過程圖
2. 實現
2.1 步驟
- 當正在閱讀Comixology App中的漫畫時,記錄iPhone屏幕;
- 通過使用OpenCV來檢測漫畫應用完成縮放,滾動等時的后處理視頻;
- 將當前的漫畫書面板保存到磁盤;
- 重復視頻的整個長度。
最終結果將是包含漫畫書的每個單板的目錄!
2.2 什么是“場景邊界”和“拍攝過渡”?
最常見的場景邊界是“淡入黑色”,從一個場景到一個場景的過渡;
通過實際應用程序應用場景邊界檢測 - 從數字漫畫書自動提取幀/面板。
場景過渡可以進行檢測前景的非黑像素,達到某個值;
2.3 代碼目錄結構
2. 源碼
# 它讀取輸入視頻,然后腳本運行邊界場景檢測方法以從視頻中提取幀。每個幀將導出到輸出/output# 實現基本場景邊界檢測器,稍后會用于從漫畫書中提取面板。
# 該算法基于背景減法/運動檢測 - 如果視頻中的“場景”在視頻中沒有任何動作,那么認為漫畫內容已完成滾動/縮放給面板,就可以捕獲當前面板并將其保存到磁盤。# USAGE
# python detect_scene.py --video xl.mp4 --output output# 導入必要的包
import argparse
import imutils
import cv2
import os# 構建命令行參數及解析
# --video 視頻文件,必須項
# --output 漫畫幀輸出路徑 必須項
# --min-percent 運動百分比默認下邊界
# --max-percent 幀運動百分比的默認上邊界。
# --暖身 構建背景模型的默認幀數
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", required=True, type=str,help="path to input video file")
ap.add_argument("-o", "--output", required=True, type=str,help="path to output directory to store frames")
ap.add_argument("-p", "--min-percent", type=float, default=1.0,help="lower boundary of percentage of motion")
ap.add_argument("-m", "--max-percent", type=float, default=10.0,help="upper boundary of percentage of motion")
ap.add_argument("-w", "--warmup", type=int, default=200,help="# of frames to use to build a reasonable background model")
args = vars(ap.parse_args())# 初始化背景減法器模型
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG()# 初始化一個布爾值顯示是否幀被捕獲,以及倆個整數,一個是已捕獲幀數,一個是已處理幀數
captured = False
total = 0
frames = 0# 打開視頻流指針,初始化幀的寬度合高度
vs = cv2.VideoCapture(args["video"])
(W, H) = (None, None)# 遍歷視頻幀
while True:# 獲取視頻幀(grabbed, frame) = vs.read()# 如果幀為None,表明已至視頻結束,終止循環if frame is None:break# 克隆當前幀,等比例縮放為寬度600(幀越小,算法越快),然后應用背景減法檢測器orig = frame.copy()frame = imutils.resize(frame, width=300)mask = fgbg.apply(frame)# 應用一系列腐蝕膨脹清除噪音mask = cv2.erode(mask, None, iterations=2)mask = cv2.dilate(mask, None, iterations=2)# 如果寬度、高度為None,獲取mask的維度(寬、高)if W is None or H is None:(H, W) = mask.shape[:2]# 計算前景mask的百分比p = (cv2.countNonZero(mask) / float(W * H)) * 100# 如果前景少于N%,則認為運動已停止,捕獲當前幀并保存在磁盤if p < args["min_percent"] and not captured and frames > args["warmup"]:# 展示捕獲的幀,并更新捕獲變量cv2.imshow("Captured", frame)# cv2.waitKey(0) # 查看捕獲幀captured = True# 構建輸出幀路徑及文件名,更新捕獲幀計數器filename = "{}.png".format(total)path = os.path.sep.join([args["output"], filename])total += 1# 保存原始的高分辨率幀到磁盤print("[INFO] saving {}".format(path))cv2.imwrite(path, orig)# 否則,幀場景正在變化,預熱模型中,更新捕獲變量為Falseelif captured and p >= args["max_percent"]:captured = False# 顯示幀并檢測是否有按鍵cv2.imshow("Frame", frame)cv2.imshow("Mask", mask)key = cv2.waitKey(1) & 0xFF# 按下‘q’鍵,退出循環if key == ord("q"):break# 增加已處理幀計數器frames += 1# 做一些清理工作,釋放指針
vs.release()
參考
- https://www.pyimagesearch.com/2019/08/19/simple-scene-boundary-shot-transition-detection-with-opencv/
總結
以上是生活随笔為你收集整理的使用Python,OpenCV实现简单的场景边界/拍摄转换检测器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gltf与glb格式转换 gltf-pi
- 下一篇: 深度学习:Opencv的Blobfrom