利用Python字符畫生成甜心教主_第1頁
利用Python字符畫生成甜心教主_第2頁
利用Python字符畫生成甜心教主_第3頁
利用Python字符畫生成甜心教主_第4頁
利用Python字符畫生成甜心教主_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第利用Python字符畫生成甜心教主目錄工具準備項目效果展示項目思路解析1.視頻拆分成視頻2.將圖片轉(zhuǎn)換字符畫3.合成視頻簡易源碼分享字符畫:字符畫是一系列字符的組合,我們可以把字符看作是比較大塊的像素,一個字符能表現(xiàn)一種顏色,字符的種類越多,可以表現(xiàn)的顏色也越多,圖片也會更有層次感。如果我們想要手工繪制出字符畫,首先要有扎實的美術(shù)基礎(chǔ),其次還要花費大量的時間和精力。但是我們可以使用Python,只需要幾行代碼,就能夠?qū)⒁粡垐D片輕而易舉地轉(zhuǎn)化為一個字符畫。

工具準備

開發(fā)工具:pycharm

開發(fā)環(huán)境:python3.7,Windows10

使用工具包:PIL,cv2,numpy

項目效果展示

項目思路解析

首先我們先將這個項目思路進行明確定位,把我們甜心教主的視頻轉(zhuǎn)換成字符畫的視頻,首先自備一段教主的視頻,在將視頻進行拆分,拆分成一張張單獨的圖片,因為我們轉(zhuǎn)成字符畫其實本質(zhì)上就是轉(zhuǎn)化成圖片數(shù)據(jù)

然后在對每一張圖片進行灰度處理,我們做個相對來說簡單一點的,灰度數(shù)據(jù)的話只有黑白,顏色更好把控,把圖片數(shù)據(jù)轉(zhuǎn)化成一個數(shù)組,通過k聚類算法把圖像進行聚類劃分,在將劃分的圖片數(shù)組根據(jù)亮度情況進行替換,根據(jù)亮度情況亮一點的用數(shù)字,稍稍暗一點的用1,白的用空白,將視頻里的圖片數(shù)據(jù)進行全部替換,在將替換好的圖片組合成一個視頻

1.視頻拆分成視頻

首先使用cv2.VideoCapture進行視頻進行抽幀,將抽幀好的圖片使用read方式進行讀取,把讀取好的數(shù)據(jù)保存在文件夾里,使用數(shù)字來保存圖片名,也方便我們在之后進行提取圖片數(shù)據(jù)進行使用

#將視頻轉(zhuǎn)換為圖片并進行計數(shù),返回總共生成了多少張圖片!

defvideo_to_pic(vp):

#vp=cv2.VideoCapture(video_path)

number=0

ifvp.isOpened():

r,frame=vp.read()

ifnotos.path.exists('cache_pic'):

os.mkdir('cache_pic')

os.chdir('cache_pic')

else:

r=False

whiler:

number+=1

cv2.imwrite(str(number)+'.jpg',frame)

r,frame=vp.read()

print('\n由視頻一共生成了{}張圖片!'.format(number))

os.chdir("..")

returnnumber

2.將圖片轉(zhuǎn)換字符畫

循環(huán)取出文件夾里面所有的圖片數(shù)據(jù)進行轉(zhuǎn)換,首先通過cv2進行圖片讀取,獲取到他的圖片數(shù)據(jù)通道,獲取到圖片數(shù)據(jù)的3通道rgb的數(shù)據(jù)信息,在將數(shù)據(jù)進行灰度處理,我們需要用他的顏色用來區(qū)分他的數(shù)據(jù)樣式,所以只能灰度來實現(xiàn),在使用numpy進行數(shù)據(jù)轉(zhuǎn)換,將獲取到的矩陣數(shù)據(jù)進行降維,轉(zhuǎn)換成一個類似列表的數(shù)據(jù)信息,使用kmeans算法對圖像數(shù)據(jù)進行分類,設(shè)置他的矩陣中心數(shù),最大迭代數(shù),以及試錯等級,k聚類算法可以自行了解,會給我們返回labels(類別)、centroids(矩心)compactness(密度值),將矩心進行數(shù)據(jù)轉(zhuǎn)換成整數(shù),我們可以更好的替換符號,對矩心進行排序,矩心大的說明顏色越暗,矩心小的越淡,在根據(jù)亮度數(shù)據(jù)將數(shù)據(jù)進行替換成一個新的畫布,將我們的符號替換到畫布上去,到這里我們就能吧單獨的圖片替換成字符畫了

defimg2strimg(frame,K=3):

#讀取矩陣的長度有時返回兩個值,有時三個值

height,width,*_=frame.shape

#print(frame.shape)

#顏色空間轉(zhuǎn)化圖片對象,灰度處理

frame_gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

#print(frame_gray)

#轉(zhuǎn)換數(shù)據(jù)類型,將數(shù)據(jù)降維

frame_array=np.float32(frame_gray.reshape(-1))

#print(frame_array)

#得到labels(類別)、centroids(矩心)compactness(密度值)。

#如第一行6個像素labels=[0,2,2,1,2,0],則意味著6個像素分別對應(yīng)著第1個矩心、第3個矩心、第3、2、3、1個矩心。

compactness,labels,centroids=cv2.kmeans(frame_array,K,None,(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0),10,cv2.KMEANS_RANDOM_CENTERS)

print(labels)

centroids=np.uint8(centroids)#轉(zhuǎn)換成整形

#labels的數(shù)個矩心以隨機順序排列,所以需要簡單處理矩心.

#返回一個折疊成一維的數(shù)組

centroids=centroids.flatten()

#排序

centroids_sorted=sorted(centroids)

#獲得不同centroids的明暗程度,0最暗

centroids_index=np.array([centroids_sorted.index(value)forvalueincentroids])

#亮度設(shè)置

bright=[abs((3*i-2*K)/(3*K))foriinrange(1,1+K)]

bright_bound=bright.index(np.min(bright))

#背景陰影設(shè)置

shadow=[abs((3*i-K)/(3*K))foriinrange(1,1+K)]

shadow_bound=shadow.index(np.min(shadow))

#返回一個折疊成一維的數(shù)組

labels=labels.flatten()

print(labels)

#將labels轉(zhuǎn)變?yōu)閷嶋H的明暗程度列表,0最暗。

labels=centroids_index[labels]

print(labels)

#列表解析,每2*2個像素挑選出一個,組成(height*width*灰)數(shù)組。

labels_picked=[labels[rows*width:(rows+1)*width:2]forrowsinrange(0,height,2)]

canvas=np.zeros((3*height,3*width,3),np.uint8)

canvas.fill(255)#創(chuàng)建長寬為原圖三倍的白色畫布。

#因為字體大小為0.45時,每個數(shù)字占6*6個像素,而白底畫布為原圖三倍

#所以需要原圖中每2*2個像素中挑取一個,在白底畫布中由6*6像素大小的數(shù)字表示這個像素信息。

y=0

forrowsinlabels_picked:

x=0

forcolsinrows:

ifcols=shadow_bound:

#添加文字圖片,添加的文字,左上角坐標,字體,字體大小,顏色,字體粗細

cv2.putText(canvas,str(random.randint(2,9)),(x,y),cv2.FONT_HERSHEY_PLAIN,0.45,0.1)

elifcols=bright_bound:

cv2.putText(canvas,"-",(x,y),cv2.FONT_HERSHEY_PLAIN,0.4,0,1)

x+=6

y+=6

returncanvas

3.合成視頻

將全部的圖片數(shù)據(jù)在進行合成一個新的視頻,視頻數(shù)據(jù)盡量不要太大,幀數(shù)越細的話,生成的視頻越大,可能好幾個G

defjpg_to_video(char_image_path,FPS):

video_fourcc=cv2.VideoWriter_fourcc(*"MP42")#設(shè)置視頻編碼器,這里使用使用MP42編碼器,可以生成更小的視頻文件

char_img_path_list=[char_image_path+r'/{}.jpg'.format(i)foriinrange(1,number+1)]#生成目標字符圖片文件的路徑列表

char_img_test=Image.open(char_img_path_list[1]).size#獲取圖片的分辨率

ifnotos.path.exists('video'):

os.mkdir('video')

video_writter=cv2.VideoWriter('video/new_char_video.avi',video_fourcc,FPS,char_img_test)

sum=len(char_img_path_list)

count=0

forimage_pathinchar_img_path_list:

img=cv2.imread(image_path)

video_writter.write(img)

end_str='100%'

count=count+1

process_bar(count/sum,start_str='',end_str=end_str,total_length=15)

video_writter.release()

print('\n')

print('================

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論