不管你是待業(yè)還是失業(yè),在這個(gè)被互聯(lián)網(wǎng)圍繞的時(shí)代里,選擇python讀取視頻,就多了一項(xiàng)技能,還怕找不到工作?,還怕不好找工作?小編就來告訴你這個(gè)專業(yè)的優(yōu)勢(shì)到底體現(xiàn)在哪里:Python玩轉(zhuǎn)視頻處理系列(一),Python玩轉(zhuǎn)視頻處理(三):從視頻中提取女神片段,Python玩轉(zhuǎn)視頻處理(二):從視頻中自動(dòng)提取人物的視頻片段,用Python從視頻中提取每一幀的圖片??。
1.Python玩轉(zhuǎn)視頻處理系列(一)
本系列教程將分享如何用Python玩轉(zhuǎn)視頻處理,本文先介紹兩個(gè)庫(kù)opencv和moivepy及其簡(jiǎn)單使用。1、opencv介紹及人臉識(shí)別OpenCV的全稱是Open Source Computer Vision Library,是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺庫(kù)。OpenCV是由英特爾公司發(fā)起并參與開發(fā),以BSD許可證授權(quán)發(fā)行,可以在商業(yè)和研究領(lǐng)域中免費(fèi)使用。OpenCV可用于開發(fā)實(shí)時(shí)的圖像處理、計(jì)算機(jī)視覺以及模式識(shí)別程序。OpenCV主要用C++語(yǔ)言編寫,Python程序可以通過Python-OpenCV這個(gè)庫(kù)調(diào)用OpenCV的相關(guān)接口。1.1 python-opencv的安裝使用pip install opencv-python命令進(jìn)行安裝,安裝完成后運(yùn)行python,導(dǎo)入cv2,命令如下:>>> import cv2 如無報(bào)錯(cuò),說明安裝成功。1.2 人臉識(shí)別原理及使用opencv的功能非常強(qiáng)大,本文中主要介紹并使用其人臉識(shí)別功能,完整功能可參考o(jì)pencv中文教程。OpenCV采用的是基于Haar的cascade分類器,它是一種機(jī)器學(xué)習(xí)方法。 基于Haar特征的cascade分類器是Paul Viola和 Michael Jone在2001年發(fā)表的論文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一種有效的物品檢測(cè)方法。它是一種機(jī)器學(xué)習(xí)方法,通過許多正負(fù)樣例中訓(xùn)練得到cascade模型,然后將其應(yīng)用于其他圖片。 針對(duì)不同的物體需要不同的分類器。OpenCV包含許多訓(xùn)練好的分類器,比如臉、眼、微笑等。這些分類器是XML文件,存儲(chǔ)在庫(kù)安裝文件夾cv2下面的data目錄中,使用時(shí)可以直接調(diào)取,也可從GitHub上下載。使用OpenCV識(shí)別人臉的步驟:初始化,導(dǎo)入cv2等Python庫(kù),加載分類器cascade文件;圖片預(yù)處理,讀取圖片,使用cvtColor函數(shù)將圖片轉(zhuǎn)為灰度圖;人臉檢測(cè),使用方法檢測(cè)圖片中的人臉。比如這里需要從下圖中識(shí)別人臉。代碼如下:import numpy import cv2 # __default.xml復(fù)制到當(dāng)前目錄下 # 或者指定該文件的完整路徑 face_cascade = cv2.("__default.xml") # 讀取圖片,使用*cvtColor*函數(shù)將圖片轉(zhuǎn)為灰度圖 img = cv2.imread("girl.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用方法檢測(cè)圖片中的人臉 faces = face_cascade.(gray, 1.3, 5) # 將人臉部分用長(zhǎng)方形表示 print(faces) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5) # 保存結(jié)果 cv2.imwrite('result.jpg',img) 效果如下:2、moviepy介紹及視頻截取moviepy是一個(gè)用于視頻編輯的python模塊,其可以用來對(duì)視頻進(jìn)行一些基礎(chǔ)的操作(比如剪切,連接,插入標(biāo)題等),視頻創(chuàng)作(比如非線性編輯),視頻處理以及給視頻增加一些炫酷的特效等。它可以讀寫大多數(shù)常見的視頻格式,包括GIF。 在之前的文章中使用moviepy從視頻中截取片段生成gif表情(用Python從視頻中生成動(dòng)態(tài)表情)。 這里介紹一個(gè)另一個(gè)從視頻中截取片段的方法,可以提升處理性能。一個(gè)基于ffmpeg的方法,使用ffmpeg_extract_subclip來處理視頻,方法如下:from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip ffmpeg_extract_subclip("full.mp4", 60, 300, ="cut.mp4") 其實(shí)這個(gè)方法就是調(diào)用ffmpeg命令處理視頻,源代碼如下:def ffmpeg_extract_subclip(filename, t1, t2, =None): """ Makes a new video file playing video file ``filename`` between the times ``t1`` and ``t2``. """ name, ext = os.path.splitext(filename) if not : T1, T2 = [int(1000*t) for t in [t1, t2]] = "%sSUB%d_%d.%s" % (name, T1, T2, ext) cmd = [get_setting("FFMPEG_BINARY"),"-y", "-ss", "%0.2f"%t1, "-i", filename, "-t", "%0.2f"%(t2-t1), # "-map", "0", "-vcodec", "copy", "-acodec", "copy", ] "-vcodec", "copy", "-acodec", "copy", ] _call(cmd) 基于上面的方法就可以實(shí)現(xiàn)后面的功能,關(guān)于moviepy的完整教程可參考moivepy官網(wǎng),在下一篇中將分享如何從視頻中提取女神片段 。歡迎關(guān)注我的公眾號(hào)“Python的樂趣”,原創(chuàng)技術(shù)文章*時(shí)間推送。 (二維碼自動(dòng)識(shí)別)
2.Python玩轉(zhuǎn)視頻處理(三):從視頻中提取女神片段
在上一篇中實(shí)現(xiàn)了基于人臉識(shí)別提取人物片段的功能,但是在實(shí)踐過程中發(fā)現(xiàn),如果是一部電影,那么提取到的片段太多了。為了找女神的電影片段,還要在辣么多剪輯中苦苦手工篩選,這個(gè)不是一個(gè)優(yōu)秀的程序員應(yīng)該做的。經(jīng)過一番實(shí)踐和探索,發(fā)現(xiàn)了一個(gè)強(qiáng)大的庫(kù),叫做face_。 本菜鳥也嘗試過用opencv識(shí)別出圖像,通過圖像指紋計(jì)算出相似度,抑或通過圖片向量的余弦相似度計(jì)算,奈何實(shí)現(xiàn)復(fù)雜,效果也不如face_,只好棄暗投明。 1. face_介紹face_使用 dlib 頂尖的深度學(xué)習(xí)人臉識(shí)別技術(shù)構(gòu)建,在戶外臉部檢測(cè)數(shù)據(jù)庫(kù)基準(zhǔn)(Labeled Faces in the Wild benchmark)上的準(zhǔn)確率高達(dá) 99.38%。項(xiàng)目地址: 找出圖片中的人臉1.2 找到并且控制圖像中的臉部特征1.3 識(shí)別圖片中的人臉在本文中使用的就是它的第三個(gè)功能識(shí)別圖片中的人臉。2. face_的安裝使用face需要依賴于dlib,dlib的安裝參考How to install dlib v19.9 or newer from github on macOS and _的使用需要基于Python3.3以上或Python2.7,操作系統(tǒng)為MacOS或Linux(Windows不提供官方支持)。安裝命令如下:$ pip install face_ 安裝完成后可以在命令行使用face_或在Python中調(diào)用。以在Python中“識(shí)別女神李一桐”為例,其過程如下:初始化,導(dǎo)入face_,加載一張李一桐的臉部圖片; 加載對(duì)比圖片,讀取圖片后進(jìn)行編碼; 對(duì)比,將已知圖片和對(duì)比圖片用compare_faces方法進(jìn)行對(duì)比并得到結(jié)果。 Python代碼如下:import face_ # 初始化 picture_of_liyitong = face_.load_image_file("yilitong.jpg") liyitong_encoding = face_.face_encodings(picture_of_liyitong)[0] # 加載對(duì)比圖片 unknown_picture = face_.load_image_file("unknown.jpg") unknown_face_encoding = face_.face_encodings(unknown_picture)[0] # 用`compare_faces`方法繼續(xù)對(duì)比得到結(jié)果, # 值得注意的是*個(gè)參數(shù)是一個(gè)列表,可以傳多個(gè)圖片參數(shù)進(jìn)行對(duì)比 results = face_.compare_faces([liyitong_encoding], unknown_face_encoding) if results[0] == True: print("圖片中包含女神") else: print("未找到女神!") 3. 女神視頻提取提取女神視頻的過程與之前《從視頻中自動(dòng)提取人物的視頻片段》的思路類似。 1.1. 獲取圖片,用moivepy讀取視頻,用iter_frames方法從中獲取圖片幀; 1.2. 標(biāo)記時(shí)間點(diǎn),利用opencv識(shí)別圖片中的人物并標(biāo)記人物出現(xiàn)的起始時(shí)間點(diǎn)和結(jié)束時(shí)間點(diǎn),并將這些時(shí)間點(diǎn)放到到一個(gè)列表中。 1.3. 視頻截取,用moivepy將上一步中標(biāo)記的時(shí)間片段從視頻中截取出來,*篩選出需要的視頻片段即可。 只是將上面第二步中“用opencv識(shí)別圖片中的人物”改為“用face_進(jìn)行對(duì)比”。代碼實(shí)現(xiàn)如下:from moviepy.editor import from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip import face_ def contain_godness(img, godness_encoding): face_locations = face_.face_locations(img) is_godness = False for (top_right_y, top_right_x, left_bottom_y,left_bottom_x) in face_locations: unknown_image = img[top_right_y-50:left_bottom_y+50, left_bottom_x-50:top_right_x+50] unknown_encoding = face_.face_encodings(unknown_image) if unknown_encoding: results = face_.compare_faces([godness_encoding], unknown_encoding[0]) print(results) is_godness = results[0] return is_godness def find_durations(clip, godness_encoding): """ 從視頻中搜索女神片段 """ duration_list = [] # 存儲(chǔ)片段時(shí)間列表 start_time = 0 # 記錄片段開始時(shí)間, 以毫秒為單位 end_time = 0 # 記錄片段結(jié)束時(shí)間, 以毫秒為單位 last_index = 0 for i, img in enumerate(clip.iter_frames(fps=20)): print(i) flag = contain_godness(img, godness_encoding) if flag and start_time == 0: start_time = i / 20 last_index = i if start_time > 0 and not flag: end_time = i / 20 duration_list.append([start_time, end_time]) # 重置開始時(shí)間和結(jié)束時(shí)間 start_time = end_time = 0 # 打印片段時(shí)間列表并返回 print(duration_list) return duration_list if __name__ == "__main__": filename = "demo.mp4" clip = (filename) godness_image = face_.load_image_file("godness.png") godness_encoding = face_.face_encodings(godness_image)[0] durations = find_durations(clip, godness_encoding) for d in durations: start_t, end_t = d ffmpeg_extract_subclip(filename, start_t, end_t) 歡迎關(guān)注我的公眾號(hào)“Python的樂趣”,原創(chuàng)技術(shù)文章*時(shí)間推送。 (二維碼自動(dòng)識(shí)別)
3.Python玩轉(zhuǎn)視頻處理(二):從視頻中自動(dòng)提取人物的視頻片段
最近在嘗試學(xué)習(xí)視頻混剪,經(jīng)常找不到合適的視頻素材。知乎搜索了一圈,給的建議是下載電影或劇集,然后用potplay之類的工具從中截取需要的片段。但作為一個(gè)程序員,讓我不停的按alt-c進(jìn)行視頻截取是不科學(xué)的,要截取也是用程序員的方式,代碼自動(dòng)化截取。本文將分享如何用Python自動(dòng)提取視頻中的人物視頻片段,這些片段可用來混剪,也可制作表情包。1. 實(shí)現(xiàn)思路整個(gè)過程基于opencv和moivepy這兩個(gè)庫(kù)實(shí)現(xiàn),基本思路如下:1.1. 獲取圖片,用moivepy讀取視頻,用iter_frames方法從中獲取圖片幀;1.2. 標(biāo)記時(shí)間點(diǎn),利用opencv識(shí)別圖片中的人物并標(biāo)記人物出現(xiàn)的起始時(shí)間點(diǎn)和結(jié)束時(shí)間點(diǎn),并將這些時(shí)間點(diǎn)放到到一個(gè)列表中。1.3. 視頻截取,用moivepy將上一步中標(biāo)記的時(shí)間片段從視頻中截取出來,*篩選出需要的視頻片段即可。2. 獲取圖片從moviepy庫(kù)中導(dǎo)入類,用這個(gè)類加載視頻文件。加載成功后通過iter_frames方法即可獲取視頻中的圖片幀。 函數(shù)說明: iter_frames(self, fps=None, with_times=False, logger=None, dtype=None) 這個(gè)方法返回視頻中的所有幀,也可以通過參數(shù)fps控制返回的幀數(shù)。比如將fps設(shè)為10,則按視頻每秒返回10幀的方式進(jìn)行返回。 代碼實(shí)現(xiàn)如下:from moviepy.editor import # 讀取視頻文件 clip = ("demo.mp4") # 以每秒20幀的方式獲取圖片幀 for i, img in enumerate(clip.iter_frames(fps=20)): # todo 對(duì)圖片進(jìn)行識(shí)別 3.標(biāo)記時(shí)間點(diǎn)在上一步中已經(jīng)從視頻中獲取了圖片幀,這一步要通過人臉識(shí)別技術(shù)檢測(cè)圖片中是否包含人臉,然后標(biāo)記出人臉出現(xiàn)的開始和結(jié)束時(shí)間點(diǎn)。實(shí)現(xiàn)的邏輯如下:a. 片段開始時(shí)間,利用opencv依次識(shí)別圖片中是否包含人臉。若包含人臉,則根據(jù)是第幾張圖片以及提取時(shí)的fps值計(jì)算出該圖片在視頻中的時(shí)間,將該時(shí)間作為片段的開始時(shí)間;b. 片段結(jié)束時(shí)間,檢測(cè)到人臉后繼續(xù)識(shí)別后面的圖片直至檢測(cè)不到人臉,計(jì)算該圖片在視頻中的時(shí)間并將它作為結(jié)束時(shí)間;c. 片段時(shí)間列表,將上面的開始時(shí)間和結(jié)束時(shí)間合在一起放到一個(gè)列表中。d. 得到標(biāo)記時(shí)間點(diǎn),重復(fù)上面的步驟,識(shí)別完全部圖片就可以得到視頻中包含人物所有的開始時(shí)間和結(jié)束時(shí)間對(duì)。代碼實(shí)現(xiàn)如下:duration_list = [] # 存儲(chǔ)片段時(shí)間列表 start_time = 0 # 記錄片段開始時(shí)間, 以毫秒為單位 end_time = 0 # 記錄片段結(jié)束時(shí)間, 以毫秒為單位 for i, img in enumerate(clip.iter_frames(fps=20)): faces = find_faces(img) print(i, faces) # 若發(fā)現(xiàn)人物出現(xiàn)且未記錄開始時(shí)間,記為開始時(shí)間 if len(faces) > 1 and start_time == 0: start_time = i / 20 # 若已記錄開始時(shí)間且人物消失,記為結(jié)束時(shí)間 # 并將開始時(shí)間和結(jié)束時(shí)間添加到片段時(shí)間列表中并重置開始時(shí)間和結(jié)束時(shí)間 if start_time > 0 and len(eyes) == 0: end_time = i * 50 duration_list.append([start_time, end_time]) # 重置開始時(shí)間和結(jié)束時(shí)間 start_time = end_time = 0 4.提取視頻片段找到要提取的片段時(shí)間點(diǎn)列表后就簡(jiǎn)單了,使用ffmpeg_extract_subclip方法將其中標(biāo)記的視頻片段提取出來即可。代碼實(shí)現(xiàn)如下:for d in duration_list: start_t, end_t = d ffmpeg_extract_subclip(filename, start_t, end_t) *從生成的視頻片段中可以輕松的找到女神的視頻。完整的代碼如下:import cv2 from moviepy.editor import from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip def find_faces(img): eys_cascade = cv2.("data/__default.xml") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = eys_cascade.(gray, 1.3, 5) return faces def find_durations(clip): """ 從視頻中搜索人物片段 """ duration_list = [] # 存儲(chǔ)片段時(shí)間列表 start_time = 0 # 記錄片段開始時(shí)間, 以毫秒為單位 end_time = 0 # 記錄片段結(jié)束時(shí)間, 以毫秒為單位 for i, img in enumerate(clip.iter_frames(fps=20)): faces = find_faces(img) print(i, faces) # 若發(fā)現(xiàn)人物出現(xiàn)且未記錄開始時(shí)間,記為開始時(shí)間 if len(faces) > 1 and start_time == 0: start_time = i / 20 # 若已記錄開始時(shí)間且人物消失,記為結(jié)束時(shí)間 # 并將開始時(shí)間和結(jié)束時(shí)間添加到片段時(shí)間列表中并重置開始時(shí)間和結(jié)束時(shí)間 if start_time > 0 and len(faces) == 0: end_time = i / 20 duration_list.append([start_time, end_time]) # 重置開始時(shí)間和結(jié)束時(shí)間 start_time = end_time = 0 # 打印片段時(shí)間列表并返回 print(duration_list) return duration_list if __name__ == "__main__": filename = "demo.mp4" clip = (filename) durations = find_durations(clip) for d in durations: start_t, end_t = d ffmpeg_extract_subclip(filename, start_t, end_t) 5. 問題及優(yōu)化建議5.1 在連續(xù)幀的人臉識(shí)別過程中,會(huì)出現(xiàn)中間幾個(gè)圖片幀識(shí)別不到人臉的情況,導(dǎo)致截取出來的視頻片段中斷。優(yōu)化這種情況可通過更改片段結(jié)束時(shí)間的判斷條件。不必一檢測(cè)不到人臉就標(biāo)記為結(jié)束,改為可容忍少數(shù)幾幀檢測(cè)不到人臉,直到未檢測(cè)到人臉幀數(shù)大于某個(gè)值,比如說5幀的時(shí)候再標(biāo)記為結(jié)束。5.2 視頻中的人物畫面中截取到的圖片很有可能不是正臉,導(dǎo)致無法檢測(cè)到人臉,遇到這種情況可以更新檢測(cè)模型,使用眼睛檢測(cè)等方式進(jìn)行驗(yàn)證。如有其它問題,歡迎交流討論。演示視頻:關(guān)注我的公眾號(hào)“Python的樂趣”,原創(chuàng)文章*時(shí)間推送。 (二維碼自動(dòng)識(shí)別)
4.用Python從視頻中提取每一幀的圖片
大家應(yīng)該都有這樣的情況:在看到某些視頻的畫面時(shí)感覺美如畫,想截取下來卻又煩于截圖的繁瑣,現(xiàn)在我就教大家使用Python提取視頻中每一幀的畫面,讓大家不錯(cuò)過每一個(gè)精彩的瞬間!?語(yǔ)言:Python?所需要的庫(kù):cv2,numpy (自行安裝)opencv中提供了讀取視頻每幀圖片的函數(shù),下面的代碼可以將視頻的每幀圖片提取出來。注:我的視頻名字叫 2.mp4 ,提取圖片保存目錄 需要自己建一個(gè)名字叫 output 的文件夾。# 導(dǎo)入所需要的庫(kù) import cv2 import numpy as np # 定義保存圖片函數(shù) # image:要保存的圖片名字 # addr;圖片地址與相片名字的前部分 # num: 相片,名字的后綴。int 類型 def save_image(image,addr,num): address = addr + str(num)+ '.jpg' cv2.imwrite(address,image) # 讀取視頻文件 = cv2.("2.mp4") # 通過攝像頭的方式 # =cv2.(1) #讀幀 success, frame = .read() i = 0 while success : i = i + 1 save_image(frame,'./output/image',m) if success: print('save image:',i)以上就是如何用Python從視頻中提取每一秒的畫面的方法,希望能幫助到大家!當(dāng)我們想按秒提取時(shí),只要我們能知道視頻每秒有多少幀,然后在上面的代碼基礎(chǔ)上每隔那么多幀提取一次就行了,這就需要查看視頻的幀率。一般情況下隨便用一個(gè)播放器打開視頻后右鍵查看其屬性就可以看到幀率?,F(xiàn)在我的視頻幀率為12 ,每隔12幀提取一次就可以得到每秒的圖片。代碼如下:# 導(dǎo)入所需要的庫(kù) import cv2 import numpy as np # 定義保存圖片函數(shù) # image:要保存的圖片名字 # addr;圖片地址與相片名字的前部分 # num: 相片,名字的后綴。int 類型 def save_image(image,addr,num): address = addr + str(num)+ '.jpg' cv2.imwrite(address,image) # 讀取視頻文件 = cv2.("2.mp4") # 通過攝像頭的方式 # =cv2.(1) #讀幀 success, frame = .read() i = 0 timeF = 12 j=0 while success : i = i + 1 if (i % timeF == 0): j = j + 1 save_image(frame,'./output/image',j) print('save image:',i) success, frame = .read()以上就是如何用Python從視頻中提取每一秒的畫面的方法,希望能幫助到大家!如果有想一起學(xué)習(xí)交流Python,獲取更多Python學(xué)習(xí)干貨的朋友可以關(guān)注我主頁(yè)哦~不定期更新關(guān)于Python學(xué)習(xí)的各種方法竅門與避坑指南!
就拿大數(shù)據(jù)說話,優(yōu)勢(shì)一目了然,從事IT行業(yè),打開IT行業(yè)的新大門,找到適合自己的培訓(xùn)機(jī)構(gòu),進(jìn)行專業(yè)和系統(tǒng)的學(xué)習(xí)。