版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第python視頻轉(zhuǎn)化字節(jié)問題的完整實現(xiàn)目錄步驟1、準(zhǔn)備2.材料3、按幀讀取視頻什么是指定要轉(zhuǎn)換的區(qū)間、幀率?看下效果圖總結(jié)廢話不多說,直接開干!
抖音字符視頻在今年火過一段時間。
反正我是始終忘不了那段劉耕宏老師本草綱目的音樂
這一次自己也來實現(xiàn)一波,做一個字符視頻出來
百度好多都是顯示模塊,這個完整實現(xiàn)效果
步驟
將視頻轉(zhuǎn)化為一幀一幀的圖片
把圖片轉(zhuǎn)化為字符畫
按順序播放字符畫
1、準(zhǔn)備
安裝Python-OpenCV庫
安裝Numpy科學(xué)計算庫
用到模塊庫
importtime
importcv2
importos
fromPILimportImage,ImageDraw,ImageFont
importnumpyasnp
importos
然后新建python代碼文檔,在開頭添加上下面的導(dǎo)入語句
2.材料
材料來個視頻文件了,我這里用的是zimeng.mp4,下載下來和代碼放到同一目錄下
你也可以換成自己的,建議是學(xué)習(xí)時盡量選個短一點的視頻,十幾秒十秒就行了,方便調(diào)試用
此外,要選擇對比度高的視頻。否則的話,就需要彩色字符才能有足夠好的表現(xiàn),有時間我試試。
3、按幀讀取視頻
現(xiàn)在繼續(xù)添加代碼,實現(xiàn)第一步:按幀讀取視頻。
下面這個函數(shù),接受視頻路徑和字符視頻的尺寸信息,返回一個img列表,其中的img是尺寸都為指定大小的灰度圖。
第一步截取圖片
defvideo_img(file='zimeng.mp4'):
#在當(dāng)前目錄下新建文件夾
folder_path="img_bear/"
iffolder_path:
pass
else:
os.makedirs(folder_path)
#進(jìn)行視頻的載入
vc=cv2.VideoCapture(file)
#判斷載入的視頻是否可以打開
ret=vc.isOpened()
#循環(huán)讀取視頻幀
num=0
whileret:
num=num+1
#進(jìn)行單張圖片的讀取,ret的值為True或者Flase,frame表示讀入的圖片
ret,frame=vc.read()
ifret:
#存儲為圖像
cv2.imwrite('img_bear/'+str(num)+'.jpg',frame)
#輸出圖像名稱
print('img_bear/'+str(num)+'.jpg')
#在一個給定的時間內(nèi)(單位ms)等待用戶按鍵觸發(fā),1ms
cv2.waitKey(1)
else:
break
#視頻釋放
vc.release()
time.sleep(0.5)
video_image(num)
如果運行沒報錯,就沒問題
代碼里的注釋應(yīng)該寫得很清晰了,繼續(xù)下一步
第二步對圖片做灰度處理
視頻轉(zhuǎn)換成了圖像,這一步便是把圖像轉(zhuǎn)換成字符畫
上面這個函數(shù),一個img對象為參數(shù),前往對應(yīng)的字符畫
defvideo_image(num=''):
#創(chuàng)建字符圖片文件夾
folder_path="bear/"
iffolder_path:
pass
else:
os.makedirs(folder_path)
foriinrange(1,num):
filename='img_bear/'+str(i)+'.jpg'
im=Image.open(filename)#返回一個Image對象
width=im.size[0]
heigth=im.size[1]
print('寬:%d,高:%d'%(im.size[0],im.size[1]))
#字符列表
ascii_char=list("$@B%8WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]-_+~i!lI;:,\"^`'.")
#判斷圖片是否存在
ifos.path.exists(filename):
#將圖片轉(zhuǎn)化為灰度圖像,并重設(shè)大小
img_array=np.array(Image.open(filename).resize((160,160),Image.ANTIALIAS).convert('L'))
#創(chuàng)建新的圖片對象
img=Image.new('L',(width,heigth),255)
draw_object=ImageDraw.Draw(img)
#設(shè)置字體
font=ImageFont.truetype('consola.ttf',10,encoding='unic')
#根據(jù)灰度值添加對應(yīng)的字符
forjinrange(160):
forkinrange(160):
x,y=k*8,j*8
index=int(img_array[j][k]/4)
draw_object.text((x,y),ascii_char[index],font=font,fill=0)
name='bear/'+str(i)+'.jpg'
print(name)
#保存字符圖片
img.save(name,'JPEG')
time.sleep(0.5)
video(num)
第三步字符轉(zhuǎn)視頻
寫了這么多代碼,如今終于要出效果了。如今就是最激動人心的一步:播放字符畫了。
異樣的,我把它封裝成了一個函數(shù)。上面這個函數(shù)承受一個字符畫的列表并播放。
defvideo(num):
filename='img_bear/'+str(1)+'.jpg'
im=Image.open(filename)#返回一個Image對象
width=im.size[0]
heigth=im.size[1]
#設(shè)置視頻編碼器,這里使用使用MJPG編碼器
fourcc=cv2.VideoWriter_fourcc(*'MJPG')
#輸出視頻參數(shù)設(shè)置,包含視頻文件名、編碼器、幀率、視頻寬高(此處參數(shù)需和字符圖片大小一致)
videoWriter=cv2.VideoWriter('bear_character.avi',fourcc,20.0,(width,heigth))
foriinrange(1,num):
filename='bear/'+str(i)+'.jpg'
#判斷圖片是否存在
ifos.path.exists(filename):
img=cv2.imread(filename=filename)
#在一個給定的時間內(nèi)(單位ms)等待用戶按鍵觸發(fā),100ms
cv2.waitKey(100)
#將圖片寫入視頻中
videoWriter.write(img)
print(str(i)+'.jpg'+'done!')
#視頻釋放
videoWriter.release()
time.sleep(1)
#刪除圖片
remove_img()
remove_img_bear()
下面完整代碼
可能要等很久。我使用示例視頻大概需要500秒左右。
ctrl+f10執(zhí)行對應(yīng)的文件
完整代碼里面加了
執(zhí)行生成圖片,生成灰度圖片,最后通過灰度生成字節(jié)視頻刪除多余文件
說了那太多廢話就是:最后還需刪除一些臨時的文件及文件夾。
importtime
importcv2
importos
fromPILimportImage,ImageDraw,ImageFont
importnumpyasnp
importos
#第一步截取圖片
defvideo_img(file='zimeng.mp4'):
#在當(dāng)前目錄下新建文件夾
folder_path="img_bear/"
iffolder_path:
pass
else:
os.makedirs(folder_path)
#進(jìn)行視頻的載入
vc=cv2.VideoCapture(file)
#判斷載入的視頻是否可以打開
ret=vc.isOpened()
#循環(huán)讀取視頻幀
num=0
whileret:
num=num+1
#進(jìn)行單張圖片的讀取,ret的值為True或者Flase,frame表示讀入的圖片
ret,frame=vc.read()
ifret:
#存儲為圖像
cv2.imwrite('img_bear/'+str(num)+'.jpg',frame)
#輸出圖像名稱
print('img_bear/'+str(num)+'.jpg')
#在一個給定的時間內(nèi)(單位ms)等待用戶按鍵觸發(fā),1ms
cv2.waitKey(1)
else:
break
#視頻釋放
vc.release()
time.sleep(0.5)
video_image(num)
#第二步對圖片做灰度處理
defvideo_image(num=''):
#創(chuàng)建字符圖片文件夾
folder_path="bear/"
iffolder_path:
pass
else:
os.makedirs(folder_path)
foriinrange(1,num):
filename='img_bear/'+str(i)+'.jpg'
im=Image.open(filename)#返回一個Image對象
width=im.size[0]
heigth=im.size[1]
print('寬:%d,高:%d'%(im.size[0],im.size[1]))
#此字符表用于生字符幀,對應(yīng)256個像素,字符越多且不同樣式,字符幀越精細(xì)
ascii_char=list("$@B%8WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]-_+~i!lI;:,\"^`'.")
#判斷圖片是否存在
ifos.path.exists(filename):
#將圖片轉(zhuǎn)化為灰度圖像,并重設(shè)大小
img_array=np.array(Image.open(filename).resize((160,160),Image.ANTIALIAS).convert('L'))
#創(chuàng)建新的圖片對象
img=Image.new('L',(width,heigth),255)
draw_object=ImageDraw.Draw(img)
#設(shè)置字體
font=ImageFont.truetype('consola.ttf',10,encoding='unic')
#根據(jù)灰度值添加對應(yīng)的字符
forjinrange(160):
forkinrange(160):
x,y=k*8,j*8
index=int(img_array[j][k]/4)
draw_object.text((x,y),ascii_char[index],font=font,fill=0)
name='bear/'+str(i)+'.jpg'
print(name)
#保存字符圖片
img.save(name,'JPEG')
time.sleep(0.5)
video(num)
#第三步字符轉(zhuǎn)視頻
defvideo(num):
filename='img_bear/'+str(1)+'.jpg'
im=Image.open(filename)#返回一個Image對象
width=im.size[0]
heigth=im.size[1]
#設(shè)置視頻編碼器,這里使用使用MJPG編碼器
fourcc=cv2.VideoWriter_fourcc(*'MJPG')
#輸出視頻參數(shù)設(shè)置,包含視頻文件名、編碼器、幀率、視頻寬高(此處參數(shù)需和字符圖片大小一致)
videoWriter=cv2.VideoWriter('bear_character.avi',fourcc,20.0,(width,heigth))
foriinrange(1,num):
filename='bear/'+str(i)+'.jpg'
#判斷圖片是否存在
ifos.path.exists(filename):
img=cv2.imread(filename=filename)
#在一個給定的時間內(nèi)(單位ms)等待用戶按鍵觸發(fā),100ms
cv2.waitKey(100)
#將圖片寫入視頻中
videoWriter.write(img)
print(str(i)+'.jpg'+'done!')
#視頻釋放
videoWriter.release()
time.sleep(1)
#刪除圖片
remove_img()
remove_img_bear()
#原圖片刪除
defremo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年海洋能發(fā)電公司財務(wù)保密工作管理制度
- 2026春貴州貴陽市觀山湖區(qū)第七中學(xué)招臨聘教師6人備考題庫附答案詳解(預(yù)熱題)
- 2026江蘇南京大學(xué)化學(xué)學(xué)院助理招聘備考題庫含答案詳解(達(dá)標(biāo)題)
- 2025年全自動生化分析儀檢測生化項目的順序試卷含答案
- 2025年特崗體育專業(yè)試題及答案
- 2025年圖書館學(xué)考試試題有答案
- 2025年耳鼻喉科考試及答案
- 2025年安全員B證項目負(fù)責(zé)人考試試題及答案(完整版)
- 2026江蘇南京大學(xué)化學(xué)學(xué)院博士后招聘備考題庫含答案詳解(綜合題)
- 2026江蘇南京大學(xué)化學(xué)學(xué)院博士后招聘備考題庫附答案詳解(黃金題型)
- 高校行政人員筆試試題(附答案)
- 2025年農(nóng)村會計考試試題題庫及答案
- 檢驗科電解質(zhì)教學(xué)課件
- 浙江省杭州市西湖區(qū)杭州學(xué)軍中學(xué)2025-2026學(xué)年物理高二上期末質(zhì)量跟蹤監(jiān)視試題含解析
- 創(chuàng)傷病人的評估和護理
- 房建工程施工工藝流程
- 設(shè)備委托開發(fā)合同(標(biāo)準(zhǔn)版)
- 理解人際溝通中的情緒管理和表達(dá)技巧應(yīng)用
- 2025 年四年級語文閱讀理解(分析人物形象)突破卷
- 手術(shù)室三方核查規(guī)范
- 2025年黑龍江省大慶市中考數(shù)學(xué)試題【含答案、解析】
評論
0/150
提交評論