python視頻轉(zhuǎn)化字節(jié)問題的完整實現(xiàn)_第1頁
python視頻轉(zhuǎn)化字節(jié)問題的完整實現(xiàn)_第2頁
python視頻轉(zhuǎn)化字節(jié)問題的完整實現(xiàn)_第3頁
python視頻轉(zhuǎn)化字節(jié)問題的完整實現(xiàn)_第4頁
python視頻轉(zhuǎn)化字節(jié)問題的完整實現(xiàn)_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論