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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 替换array中的值_利用Python提取视频中的字幕(文字识别)

發布時間:2023/12/31 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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提取视频中的字幕(文字识别)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。