日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

使用Python,OpenCV实现简单的场景边界/拍摄转换检测器

發(fā)布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Python,OpenCV实现简单的场景边界/拍摄转换检测器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用Python,OpenCV進行簡單的場景邊界/拍攝轉(zhuǎn)換檢測器

    • 1. 效果圖
    • 2. 實現(xiàn)
      • 2.1 步驟
      • 2.2 什么是“場景邊界”和“拍攝過渡”?
      • 2.3 代碼目錄結(jié)構(gòu)
    • 2. 源碼
    • 參考

這篇博客起源于朋友分享蝙蝠俠7更新了,而我沒有辦法去最近的書店買書。于是下載了電子書,電子書已經(jīng)實現(xiàn)了左擊或者右擊自動縮放、滾動。

然而我想自己通過計算機視覺的技術(shù)實現(xiàn)——自動從數(shù)字漫畫中提取每個面板,縮放滾動等;

核心是場景邊界檢測算法,這篇博客將用100行代碼實現(xiàn)此算法;

這篇博客介紹了如何使用OpenCV實現(xiàn)簡單場景邊界檢測算法,并將該算法應(yīng)用于數(shù)字漫畫書籍,自動提取了漫畫書的每個單獨面板。您也可以使用您自己的視頻。

1. 效果圖

原始視頻幀 VS Mask VS 截取的動畫幀

過程圖

2. 實現(xiàn)

2.1 步驟

  1. 當(dāng)正在閱讀Comixology App中的漫畫時,記錄iPhone屏幕;
  2. 通過使用OpenCV來檢測漫畫應(yīng)用完成縮放,滾動等時的后處理視頻;
  3. 將當(dāng)前的漫畫書面板保存到磁盤;
  4. 重復(fù)視頻的整個長度。

最終結(jié)果將是包含漫畫書的每個單板的目錄!

2.2 什么是“場景邊界”和“拍攝過渡”?

最常見的場景邊界是“淡入黑色”,從一個場景到一個場景的過渡;
通過實際應(yīng)用程序應(yīng)用場景邊界檢測 - 從數(shù)字漫畫書自動提取幀/面板。

場景過渡可以進行檢測前景的非黑像素,達到某個值;

2.3 代碼目錄結(jié)構(gòu)

2. 源碼

# 它讀取輸入視頻,然后腳本運行邊界場景檢測方法以從視頻中提取幀。每個幀將導(dǎo)出到輸出/output# 實現(xiàn)基本場景邊界檢測器,稍后會用于從漫畫書中提取面板。
# 該算法基于背景減法/運動檢測 - 如果視頻中的“場景”在視頻中沒有任何動作,那么認為漫畫內(nèi)容已完成滾動/縮放給面板,就可以捕獲當(dāng)前面板并將其保存到磁盤。# USAGE
# python detect_scene.py --video xl.mp4 --output output# 導(dǎo)入必要的包
import argparse
import imutils
import cv2
import os# 構(gòu)建命令行參數(shù)及解析
# --video 視頻文件,必須項
# --output 漫畫幀輸出路徑 必須項
# --min-percent 運動百分比默認下邊界
# --max-percent 幀運動百分比的默認上邊界。
# --暖身 構(gòu)建背景模型的默認幀數(shù)
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()# 初始化一個布爾值顯示是否幀被捕獲,以及倆個整數(shù),一個是已捕獲幀數(shù),一個是已處理幀數(shù)
captured = False
total = 0
frames = 0# 打開視頻流指針,初始化幀的寬度合高度
vs = cv2.VideoCapture(args["video"])
(W, H) = (None, None)# 遍歷視頻幀
while True:# 獲取視頻幀(grabbed, frame) = vs.read()# 如果幀為None,表明已至視頻結(jié)束,終止循環(huán)if frame is None:break# 克隆當(dāng)前幀,等比例縮放為寬度600(幀越小,算法越快),然后應(yīng)用背景減法檢測器orig = frame.copy()frame = imutils.resize(frame, width=300)mask = fgbg.apply(frame)# 應(yīng)用一系列腐蝕膨脹清除噪音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%,則認為運動已停止,捕獲當(dāng)前幀并保存在磁盤if p < args["min_percent"] and not captured and frames > args["warmup"]:# 展示捕獲的幀,并更新捕獲變量cv2.imshow("Captured", frame)# cv2.waitKey(0)   # 查看捕獲幀captured = True# 構(gòu)建輸出幀路徑及文件名,更新捕獲幀計數(shù)器filename = "{}.png".format(total)path = os.path.sep.join([args["output"], filename])total += 1# 保存原始的高分辨率幀到磁盤print("[INFO] saving {}".format(path))cv2.imwrite(path, orig)# 否則,幀場景正在變化,預(yù)熱模型中,更新捕獲變量為Falseelif captured and p >= args["max_percent"]:captured = False# 顯示幀并檢測是否有按鍵cv2.imshow("Frame", frame)cv2.imshow("Mask", mask)key = cv2.waitKey(1) & 0xFF# 按下‘q’鍵,退出循環(huán)if key == ord("q"):break# 增加已處理幀計數(shù)器frames += 1# 做一些清理工作,釋放指針
vs.release()

參考

  • https://www.pyimagesearch.com/2019/08/19/simple-scene-boundary-shot-transition-detection-with-opencv/

總結(jié)

以上是生活随笔為你收集整理的使用Python,OpenCV实现简单的场景边界/拍摄转换检测器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。