python 替换array中的值_利用Python提取视频中的字幕(文字识别)
我的CSDN博客id:qq_39783601,昵稱是糖潮麗子~辣麗
從今天開始我會陸續將數據分析師相關的知識點分享在這里,包括Python、機器學習、數據庫等等。
今天來分享一個Python小項目!
文字識別
- 項目背景
- 需求闡述
- 思路
- 首先導包
- 代碼詳情
- 裁剪視頻
- 創建文本
- 判斷中文
- 截取字幕
- 訪問百度API
- 讀取圖片&字幕操作
- 主方法控制臺輸出運行
項目背景
通過獲取百度API實現視頻文字識別。
需求闡述
將.MP4格式視頻裁剪成一幀一幀的圖片再將圖片中的字幕摘取出來,保存成一個文檔。
進入正題嘍!!!
思路
1.將視頻按幀截取成圖片
2.將上一步截取的圖片再進行裁剪,只保留字幕部分,然后在進行灰度處理
3.調用百度api識別文字
4.輸出成txt
首先導包
# base64是一種將不可見字符轉換為可見字符的編碼方式 import base64 # opencv是跨平臺計算機視覺庫,實現了圖像處理和計算機視覺方面的很多通用算法 import osimport cv2 import requests from aip import AipOcr # 百度AI的文字識別庫base64 base64是一種將不可見字符轉換為可見字符的編碼方式。
opencv 是跨平臺計算機視覺庫,實現了圖像處理和計算機視覺方面的很多通用算法。
AipOcr 百度AI的文字識別庫。
注意:這里from aip import AipOcr剛開始可能會報錯,原因可能是aip和baidu-aip根本不是同一個包,如果想要import的時候,都是使用:import aip 之后pip install baidu-aip就沒報錯了。
代碼詳情
裁剪視頻
def tailor_video():# 要提取視頻的文件名,隱藏后綴sourceFileName = 'material'# 在這里把后綴接上video_path = os.path.join("G:/material/", sourceFileName + '.mp4')times = 0# 提取視頻的頻率,每10幀提取一個frameFrequency = 10# 輸出圖片到當前目錄video文件夾下outPutDirName = 'G:/material/video/' + sourceFileName + '/'if not os.path.exists(outPutDirName):# 如果文件目錄不存在則創建目錄os.makedirs(outPutDirName)camera = cv2.VideoCapture(video_path)while True:times += 1res, image = camera.read()if not res:print('not res , not image')breakif times % frameFrequency == 0:cv2.imwrite(outPutDirName + str(times) + '.jpg', image) #文件目錄下將輸出的圖片名字命名為10.jpg這種形式print(outPutDirName + str(times) + '.jpg')print('圖片提取結束')這里定義一個函數用來裁剪視頻。
我們需要將視頻裁剪成一幀一幀的圖片,將圖片保存成10.jpg這種形式,并且將這些裁剪后的圖片放在一個目錄下。
這里我設置的是每10幀裁剪一張,你也可以任意設置多少幀裁剪。
視頻裁剪后的圖片效果:
創建文本
def text_create(name, msg):desktop_path = "G:/material/" # 新創建的txt文件的存放路徑full_path = desktop_path + name + '.txt' # 也可以創建一個.doc的word文檔file = open(full_path, 'w')file.write(msg)file.close()這里創建一個函數,用來存放提取后的文字信息。
創建.txt文本存放提取后的文字。
判斷中文
# 定義一個函數,用來判斷是否是中文,是中文的話就返回True代表要提取中文字幕 def is_Chinese(word):for ch in word:if 'u4e00' <= ch <= 'u9fff':return Truereturn False定義一個函數,用來判斷是否是中文,是中文的話就返回True代表要提取中文字幕,不是中文的就返回False。
截取字幕
def tailor(path1,path2,begin,end,step_size): #截取字幕for i in range(begin,end,step_size):fname1=path1 % str(i)print(fname1)img = cv2.imread(fname1)print(img.shape)cropped = img[500:600, 100:750] # 裁剪坐標為[y0:y1, x0:x1]imgray = cv2.cvtColor(cropped, cv2.COLOR_BGR2GRAY)thresh = 200ret, binary = cv2.threshold(imgray, thresh, 255, cv2.THRESH_BINARY) # 輸入灰度圖,輸出二值圖binary1 = cv2.bitwise_not(binary) # 取反cv2.imwrite(path2 % str(i), binary1)對字幕進行灰度處理,目的是使截取的字幕更加清晰。
如下效果:
裁剪視頻得到的圖片(其一):
截取字幕后:
進行灰度處理后:
對于灰度處理,二值化處理不明白的可以參考如下文章。
基本的閾值操作 - OpenCV 2.3.2 documentation
Opencv之圖像固定閾值二值化處理threshold_人工智能_qq_37385726的博客-CSDN博客
訪問百度API
# 定義一個函數,用來訪問百度API, def requestApi(img):request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"params = {"image": img,'language_type':'CHN_ENG'}access_token = '24.b802cd212b0e702b018f999c594b6d9f.2592000.1589466832.282335-19430506'request_url = request_url + "?access_token=" + access_tokenheaders = {'content-type': 'application/x-www-form-urlencoded'}response = requests.post(request_url, data=params, headers=headers)results=response.json()return results這里的access_token是這么來的:
首先你需要百度搜索:百度ocr—— 點擊文字識別
第二步:點擊立即使用
第三步:創建應用
第四步:隨便填寫一個名稱,然后立即創建。
創建成功后你就會看到你剛才創建的一個應用test。
此時,我們需要這里的API Key和Secret Key兩個參數中的內容,用來獲取access_token的內容。
接下來第五步點擊技術文檔
第六步:點擊通用文字識別
這里有access_token相關的介紹,可以點擊Access Token獲取查看詳情。
詳情介紹了如何獲取Access Token。
復制下面鏈接到瀏覽器:
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&
替換對應如下的內容,就是上面創建應用test后得到的API Key和Secret Key兩個參數中的內容,對應替換。
替換后回車就會得到:access Token的值。
其他代碼中剩余的參數可以自行設置。
讀取圖片&字幕操作
def get_file_content(filePath):with open(filePath, 'rb') as fp:# 將讀取出來的圖片轉換為b64encode編碼格式return base64.b64encode(fp.read()) # 定義函數字幕,用來對字幕進行操作 # step_size 步長 def subtitle(fname,begin,end,step_size):array =[] #定義一個數組用來存放wordsfor i in range(begin,end,step_size): #begin開始,end結束,循環按照步長step_size遍歷,共有419張圖片,也就是(1,420,10)fname1=fname % str(i)print(fname1)image = get_file_content(fname1)try:results=requestApi(image)['words_result'] #調用requestApi函數,獲取json字符串中的words_resultfor item in results:print(results)if is_Chinese(item['words']):array.append(item['words'].replace('獵奇筆記本', '')) # 將圖片中不需要的字幕“獵奇筆記本”替換為空except Exception as e:print(e)text=''result = list(set(array)) # 將array數組準換為一個無序不重復元素集達到去重的效果,再轉為列表result.sort(key=array.index) # 利用sort將數組中的元素即字幕重新排序,達到視頻播放字幕的順序for item in result:print(item)text+=item+'n'text_create('test1',text)首先需要對讀取到的圖片進行轉碼,轉為b64encode編碼格式。
其中,在圖片識別時候可能會識別到除字幕外的文字,我們還需要將圖片中不需要的文字替換為空,只獲取字幕。
例如:此處我們需要將“獵奇筆記本”替換為空。
主方法控制臺輸出運行
if __name__ =="__main__":path1 = 'G:/material/video/img/%s.jpg' # 視頻轉為圖片存放的路徑(幀)path2 = 'G:/material/video/img2/%s.jpg' # 圖片截取字幕后存放的路徑print("""1.圖片裁剪2.提取字幕3.裁剪視頻""")choose=input()begin=100end=1000step_size=10if choose=='1':tailor(path1,path2,begin,end,step_size)if choose=='2':subtitle(path2,begin,end,step_size)if choose=='3':tailor_video()結果:
結果中精確度還不是很高,不過80%的文字都提取到了還算可以哦。這次只是做了一個小小的練習,代碼還可以繼續優化,獲取到的字幕還能夠更加準確哦。
原文鏈接:利用Python提取視頻中的字幕(文字識別)_python_qq_39783601的博客-CSDN博客
總結
以上是生活随笔為你收集整理的python 替换array中的值_利用Python提取视频中的字幕(文字识别)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工行营业时间 工行的上班时间是什么时候
- 下一篇: websocket python爬虫_p