天才教育網(wǎng)合作機構 > 編程語言培訓機構 > Python培訓機構 >

全國python學習中心

歡迎您!
朋友圈

400-850-8622

全國統(tǒng)一學習專線 9:00-21:00

位置:編程語言培訓資訊 > Python培訓資訊 > python讀取視頻,Python玩轉視頻處理(三):從視頻中提取女神片段

python讀取視頻,Python玩轉視頻處理(三):從視頻中提取女神片段

日期:2021-06-16 08:23:29     瀏覽:345    來源:全國python學習中心
核心提示:不管你是待業(yè)還是失業(yè),在這個被互聯(lián)網(wǎng)圍繞的時代里,選擇python讀取視頻,就多了一項技能,還怕找不到工作?,還怕不好找工作?小編就來告訴你這個專業(yè)的優(yōu)勢到底體現(xiàn)在哪里:Python玩轉視頻處理系列(一),Python

不管你是待業(yè)還是失業(yè),在這個被互聯(lián)網(wǎng)圍繞的時代里,選擇python讀取視頻,就多了一項技能,還怕找不到工作?,還怕不好找工作?小編就來告訴你這個專業(yè)的優(yōu)勢到底體現(xiàn)在哪里:Python玩轉視頻處理系列(一),Python玩轉視頻處理(三):從視頻中提取女神片段,Python玩轉視頻處理(二):從視頻中自動提取人物的視頻片段,用Python從視頻中提取每一幀的圖片??。

1.Python玩轉視頻處理系列(一)

本系列教程將分享如何用Python玩轉視頻處理,本文先介紹兩個庫opencv和moivepy及其簡單使用。1、opencv介紹及人臉識別OpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的計算機視覺庫。OpenCV是由英特爾公司發(fā)起并參與開發(fā),以BSD許可證授權發(fā)行,可以在商業(yè)和研究領域中免費使用。OpenCV可用于開發(fā)實時的圖像處理、計算機視覺以及模式識別程序。OpenCV主要用C++語言編寫,Python程序可以通過Python-OpenCV這個庫調用OpenCV的相關接口。1.1 python-opencv的安裝使用pip install opencv-python命令進行安裝,安裝完成后運行python,導入cv2,命令如下:>>> import cv2 如無報錯,說明安裝成功。1.2 人臉識別原理及使用opencv的功能非常強大,本文中主要介紹并使用其人臉識別功能,完整功能可參考opencv中文教程。OpenCV采用的是基于Haar的cascade分類器,它是一種機器學習方法。 基于Haar特征的cascade分類器是Paul Viola和 Michael Jone在2001年發(fā)表的論文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一種有效的物品檢測方法。它是一種機器學習方法,通過許多正負樣例中訓練得到cascade模型,然后將其應用于其他圖片。 針對不同的物體需要不同的分類器。OpenCV包含許多訓練好的分類器,比如臉、眼、微笑等。這些分類器是XML文件,存儲在庫安裝文件夾cv2下面的data目錄中,使用時可以直接調取,也可從GitHub上下載。使用OpenCV識別人臉的步驟:初始化,導入cv2等Python庫,加載分類器cascade文件;圖片預處理,讀取圖片,使用cvtColor函數(shù)將圖片轉為灰度圖;人臉檢測,使用方法檢測圖片中的人臉。比如這里需要從下圖中識別人臉。代碼如下:import numpy import cv2 # __default.xml復制到當前目錄下 # 或者指定該文件的完整路徑 face_cascade = cv2.("__default.xml") # 讀取圖片,使用*cvtColor*函數(shù)將圖片轉為灰度圖 img = cv2.imread("girl.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用方法檢測圖片中的人臉 faces = face_cascade.(gray, 1.3, 5) # 將人臉部分用長方形表示 print(faces) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5) # 保存結果 cv2.imwrite('result.jpg',img) 效果如下:2、moviepy介紹及視頻截取moviepy是一個用于視頻編輯的python模塊,其可以用來對視頻進行一些基礎的操作(比如剪切,連接,插入標題等),視頻創(chuàng)作(比如非線性編輯),視頻處理以及給視頻增加一些炫酷的特效等。它可以讀寫大多數(shù)常見的視頻格式,包括GIF。 在之前的文章中使用moviepy從視頻中截取片段生成gif表情(用Python從視頻中生成動態(tài)表情)。 這里介紹一個另一個從視頻中截取片段的方法,可以提升處理性能。一個基于ffmpeg的方法,使用ffmpeg_extract_subclip來處理視頻,方法如下:from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip ffmpeg_extract_subclip("full.mp4", 60, 300, ="cut.mp4") 其實這個方法就是調用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) 基于上面的方法就可以實現(xiàn)后面的功能,關于moviepy的完整教程可參考moivepy官網(wǎng),在下一篇中將分享如何從視頻中提取女神片段 。歡迎關注我的公眾號“Python的樂趣”,原創(chuàng)技術文章*時間推送。 (二維碼自動識別)

2.Python玩轉視頻處理(三):從視頻中提取女神片段

在上一篇中實現(xiàn)了基于人臉識別提取人物片段的功能,但是在實踐過程中發(fā)現(xiàn),如果是一部電影,那么提取到的片段太多了。為了找女神的電影片段,還要在辣么多剪輯中苦苦手工篩選,這個不是一個優(yōu)秀的程序員應該做的。經(jīng)過一番實踐和探索,發(fā)現(xiàn)了一個強大的庫,叫做face_。 本菜鳥也嘗試過用opencv識別出圖像,通過圖像指紋計算出相似度,抑或通過圖片向量的余弦相似度計算,奈何實現(xiàn)復雜,效果也不如face_,只好棄暗投明。 1. face_介紹face_使用 dlib 頂尖的深度學習人臉識別技術構建,在戶外臉部檢測數(shù)據(jù)庫基準(Labeled Faces in the Wild benchmark)上的準確率高達 99.38%。項目地址: 找出圖片中的人臉1.2 找到并且控制圖像中的臉部特征1.3 識別圖片中的人臉在本文中使用的就是它的第三個功能識別圖片中的人臉。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中調用。以在Python中“識別女神李一桐”為例,其過程如下:初始化,導入face_,加載一張李一桐的臉部圖片; 加載對比圖片,讀取圖片后進行編碼; 對比,將已知圖片和對比圖片用compare_faces方法進行對比并得到結果。 Python代碼如下:import face_ # 初始化 picture_of_liyitong = face_.load_image_file("yilitong.jpg") liyitong_encoding = face_.face_encodings(picture_of_liyitong)[0] # 加載對比圖片 unknown_picture = face_.load_image_file("unknown.jpg") unknown_face_encoding = face_.face_encodings(unknown_picture)[0] # 用`compare_faces`方法繼續(xù)對比得到結果, # 值得注意的是*個參數(shù)是一個列表,可以傳多個圖片參數(shù)進行對比 results = face_.compare_faces([liyitong_encoding], unknown_face_encoding) if results[0] == True: print("圖片中包含女神") else: print("未找到女神!") 3. 女神視頻提取提取女神視頻的過程與之前《從視頻中自動提取人物的視頻片段》的思路類似。 1.1. 獲取圖片,用moivepy讀取視頻,用iter_frames方法從中獲取圖片幀; 1.2. 標記時間點,利用opencv識別圖片中的人物并標記人物出現(xiàn)的起始時間點和結束時間點,并將這些時間點放到到一個列表中。 1.3. 視頻截取,用moivepy將上一步中標記的時間片段從視頻中截取出來,*篩選出需要的視頻片段即可。 只是將上面第二步中“用opencv識別圖片中的人物”改為“用face_進行對比”。代碼實現(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 = [] # 存儲片段時間列表 start_time = 0 # 記錄片段開始時間, 以毫秒為單位 end_time = 0 # 記錄片段結束時間, 以毫秒為單位 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]) # 重置開始時間和結束時間 start_time = end_time = 0 # 打印片段時間列表并返回 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) 歡迎關注我的公眾號“Python的樂趣”,原創(chuàng)技術文章*時間推送。 (二維碼自動識別)

3.Python玩轉視頻處理(二):從視頻中自動提取人物的視頻片段

最近在嘗試學習視頻混剪,經(jīng)常找不到合適的視頻素材。知乎搜索了一圈,給的建議是下載電影或劇集,然后用potplay之類的工具從中截取需要的片段。但作為一個程序員,讓我不停的按alt-c進行視頻截取是不科學的,要截取也是用程序員的方式,代碼自動化截取。本文將分享如何用Python自動提取視頻中的人物視頻片段,這些片段可用來混剪,也可制作表情包。1. 實現(xiàn)思路整個過程基于opencv和moivepy這兩個庫實現(xiàn),基本思路如下:1.1. 獲取圖片,用moivepy讀取視頻,用iter_frames方法從中獲取圖片幀;1.2. 標記時間點,利用opencv識別圖片中的人物并標記人物出現(xiàn)的起始時間點和結束時間點,并將這些時間點放到到一個列表中。1.3. 視頻截取,用moivepy將上一步中標記的時間片段從視頻中截取出來,*篩選出需要的視頻片段即可。2. 獲取圖片從moviepy庫中導入類,用這個類加載視頻文件。加載成功后通過iter_frames方法即可獲取視頻中的圖片幀。 函數(shù)說明: iter_frames(self, fps=None, with_times=False, logger=None, dtype=None) 這個方法返回視頻中的所有幀,也可以通過參數(shù)fps控制返回的幀數(shù)。比如將fps設為10,則按視頻每秒返回10幀的方式進行返回。 代碼實現(xiàn)如下:from moviepy.editor import # 讀取視頻文件 clip = ("demo.mp4") # 以每秒20幀的方式獲取圖片幀 for i, img in enumerate(clip.iter_frames(fps=20)): # todo 對圖片進行識別 3.標記時間點在上一步中已經(jīng)從視頻中獲取了圖片幀,這一步要通過人臉識別技術檢測圖片中是否包含人臉,然后標記出人臉出現(xiàn)的開始和結束時間點。實現(xiàn)的邏輯如下:a. 片段開始時間,利用opencv依次識別圖片中是否包含人臉。若包含人臉,則根據(jù)是第幾張圖片以及提取時的fps值計算出該圖片在視頻中的時間,將該時間作為片段的開始時間;b. 片段結束時間,檢測到人臉后繼續(xù)識別后面的圖片直至檢測不到人臉,計算該圖片在視頻中的時間并將它作為結束時間;c. 片段時間列表,將上面的開始時間和結束時間合在一起放到一個列表中。d. 得到標記時間點,重復上面的步驟,識別完全部圖片就可以得到視頻中包含人物所有的開始時間和結束時間對。代碼實現(xiàn)如下:duration_list = [] # 存儲片段時間列表 start_time = 0 # 記錄片段開始時間, 以毫秒為單位 end_time = 0 # 記錄片段結束時間, 以毫秒為單位 for i, img in enumerate(clip.iter_frames(fps=20)): faces = find_faces(img) print(i, faces) # 若發(fā)現(xiàn)人物出現(xiàn)且未記錄開始時間,記為開始時間 if len(faces) > 1 and start_time == 0: start_time = i / 20 # 若已記錄開始時間且人物消失,記為結束時間 # 并將開始時間和結束時間添加到片段時間列表中并重置開始時間和結束時間 if start_time > 0 and len(eyes) == 0: end_time = i * 50 duration_list.append([start_time, end_time]) # 重置開始時間和結束時間 start_time = end_time = 0 4.提取視頻片段找到要提取的片段時間點列表后就簡單了,使用ffmpeg_extract_subclip方法將其中標記的視頻片段提取出來即可。代碼實現(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 = [] # 存儲片段時間列表 start_time = 0 # 記錄片段開始時間, 以毫秒為單位 end_time = 0 # 記錄片段結束時間, 以毫秒為單位 for i, img in enumerate(clip.iter_frames(fps=20)): faces = find_faces(img) print(i, faces) # 若發(fā)現(xiàn)人物出現(xiàn)且未記錄開始時間,記為開始時間 if len(faces) > 1 and start_time == 0: start_time = i / 20 # 若已記錄開始時間且人物消失,記為結束時間 # 并將開始時間和結束時間添加到片段時間列表中并重置開始時間和結束時間 if start_time > 0 and len(faces) == 0: end_time = i / 20 duration_list.append([start_time, end_time]) # 重置開始時間和結束時間 start_time = end_time = 0 # 打印片段時間列表并返回 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ù)幀的人臉識別過程中,會出現(xiàn)中間幾個圖片幀識別不到人臉的情況,導致截取出來的視頻片段中斷。優(yōu)化這種情況可通過更改片段結束時間的判斷條件。不必一檢測不到人臉就標記為結束,改為可容忍少數(shù)幾幀檢測不到人臉,直到未檢測到人臉幀數(shù)大于某個值,比如說5幀的時候再標記為結束。5.2 視頻中的人物畫面中截取到的圖片很有可能不是正臉,導致無法檢測到人臉,遇到這種情況可以更新檢測模型,使用眼睛檢測等方式進行驗證。如有其它問題,歡迎交流討論。演示視頻:關注我的公眾號“Python的樂趣”,原創(chuàng)文章*時間推送。 (二維碼自動識別)

4.用Python從視頻中提取每一幀的圖片

大家應該都有這樣的情況:在看到某些視頻的畫面時感覺美如畫,想截取下來卻又煩于截圖的繁瑣,現(xiàn)在我就教大家使用Python提取視頻中每一幀的畫面,讓大家不錯過每一個精彩的瞬間!?語言:Python?所需要的庫:cv2,numpy (自行安裝)opencv中提供了讀取視頻每幀圖片的函數(shù),下面的代碼可以將視頻的每幀圖片提取出來。注:我的視頻名字叫 2.mp4 ,提取圖片保存目錄 需要自己建一個名字叫 output 的文件夾。# 導入所需要的庫 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從視頻中提取每一秒的畫面的方法,希望能幫助到大家!當我們想按秒提取時,只要我們能知道視頻每秒有多少幀,然后在上面的代碼基礎上每隔那么多幀提取一次就行了,這就需要查看視頻的幀率。一般情況下隨便用一個播放器打開視頻后右鍵查看其屬性就可以看到幀率?,F(xiàn)在我的視頻幀率為12 ,每隔12幀提取一次就可以得到每秒的圖片。代碼如下:# 導入所需要的庫 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從視頻中提取每一秒的畫面的方法,希望能幫助到大家!如果有想一起學習交流Python,獲取更多Python學習干貨的朋友可以關注我主頁哦~不定期更新關于Python學習的各種方法竅門與避坑指南!

就拿大數(shù)據(jù)說話,優(yōu)勢一目了然,從事IT行業(yè),打開IT行業(yè)的新大門,找到適合自己的培訓機構,進行專業(yè)和系統(tǒng)的學習。

本文由 全國python學習中心 整理發(fā)布。更多培訓課程,學習資訊,課程優(yōu)惠,課程開班,學校地址等學校信息,可以留下你的聯(lián)系方式,讓課程老師跟你詳細解答:
咨詢電話:400-850-8622

如果本頁不是您要找的課程,您也可以百度查找一下: