課程PPT錄屏轉(zhuǎn)PDF
前言
在看課程錄屏復(fù)習(xí)時(shí)發(fā)現(xiàn)一些視頻畫(huà)面主要由不同PPT頁(yè)面組成,為了方便PPT查看浇垦,可以通過(guò)幀差法判斷視頻中不同的頁(yè)面并提取出來(lái)合并成PDF查看。
步驟
1. 關(guān)鍵幀提取
考慮到老師在講課時(shí)每一頁(yè)P(yáng)PT需要講解一定時(shí)間审丘,因此使用ffmpeg以10s為間隔提取視頻關(guān)鍵幀嵌屎。對(duì)應(yīng)的ffmpeg命令為
ffmpeg.exe -i {VIDEO_PATH} -q:v 2 -vf fps=fps=1/10 -f image2 {TEMP_PATH}\image-%5d.jpg
2. 關(guān)鍵幀查重
以10s間隔提取的關(guān)鍵幀仍存在大量的重復(fù)幀,需要通過(guò)幀差法篩選出不重復(fù)的畫(huà)面顿颅「妆簦考慮到RGB圖像影響因素較多并且PPT變化的主要內(nèi)容為文字,采用圖片的邊緣特征進(jìn)行幀差比較粱腻。
通過(guò)觀察幀差法的誤差曲線可以發(fā)現(xiàn)圖像變化的閾值在3左右绍填。
edge = lambda path: cv2.Canny(cv2.cvtColor(cv2.imread(path), cv2.COLOR_BGR2GRAY), 200, 250)
last_image =None
delta = []
images_path = []
for each in os.listdir(TEMP):
images_path.append(os.path.join(TEMP, each))
image = edge(images_path[-1])
if last_image is not None:
delta.append((image - last_image).mean())
last_image = image
images = []
unique_images = np.array(images_path)[np.where(np.array(delta)>3)[0]]
3. 關(guān)鍵幀合并
最后使用PIL進(jìn)行關(guān)鍵幀合并導(dǎo)出為PDF
for f in unique_images:
images.append(Image.open(f))
images[0].save(OUTPUT,'PDF',save_all=True, append_images=images[1:])
整體代碼
import os, shutil, cv2, argparse
import numpy as np
from PIL import Image
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--video')
parser.add_argument('-t', '--temp', default="C:/Users/311/Desktop/test/mp4")
parser.add_argument('-o', '--output')
args = parser.parse_args()
VIDEO = args.video
TEMP = args.temp
OUTPUT = args.output
if os.path.exists(TEMP):
shutil.rmtree(TEMP)
os.makedirs(TEMP)
cmd = f'ffmpeg.exe -i {VIDEO} -q:v 2 -vf fps=fps=1/10 -f image2 {TEMP}\image-%5d.jpg'
os.system(cmd)
edge = lambda path: cv2.Canny(cv2.cvtColor(cv2.imread(path), cv2.COLOR_BGR2GRAY), 200, 250)
last_image =None
delta = []
images_path = []
for each in os.listdir(TEMP):
images_path.append(os.path.join(TEMP, each))
image = edge(images_path[-1])
if last_image is not None:
delta.append(image - last_image.mean())
last_image = image
images = []
unique_images = np.array(images_path)[np.where(np.array(delta)>3)[0]]
for f in unique_images:
images.append(Image.open(f))
images[0].save(OUTPUT,'PDF',save_all=True, append_images=images[1:])