最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

?Python?代碼制作動態(tài)鞭炮

 更新時間:2022年01月26日 17:55:53   作者:FrigidWinter?  
這篇文章主要介紹了?Python?代碼制作動態(tài)鞭炮,將一個錄制好的鞭炮視頻以字符畫的形式復(fù)現(xiàn),基本步驟是幀采樣?→?逐幀轉(zhuǎn)換為字符畫?→?字符畫合成視頻,下面來看看具體的實現(xiàn)步驟吧,需要的小伙伴可以參考一下

前言:

放鞭炮賀新春,在我國有兩千多年歷史。關(guān)于鞭炮的起源,有個有趣的傳說。

西方山中有焉,長尺余,一足,性不畏人。犯之令人寒熱,名曰年驚憚,后人遂象其形,以火藥為之。——《神異經(jīng)》

當初人們?nèi)贾穸?,是為了?qū)嚇危害人們的山魈。據(jù)說山魈最怕火光和響聲,所以每到除夕,人們便“燃竹而爆”,把山魈嚇跑。這樣年復(fù)一年,便形成了過年放鞭炮、點紅燭、敲鑼打鼓歡慶新春的年俗。

新年新氣象,今天就用代碼來制作一個 動態(tài)鞭炮 ,

效果如下所示:

動態(tài)鞭炮的基本原理是:將一個錄制好的鞭炮視頻以字符畫的形式復(fù)現(xiàn),基本步驟是幀采樣 → 逐幀轉(zhuǎn)換為字符畫 → 字符畫合成視頻。下面開始吧!

1 視頻幀采樣

函數(shù)如下所示,主要功能是將視頻的圖像流逐幀保存到特定的緩存文件夾中(若該文件夾不存在會自動創(chuàng)建)。函數(shù)輸入vp是openCV視頻句柄,輸出number是轉(zhuǎn)換的圖片數(shù)。

def video2Pic(vp):
? ? number = 0
? ? if vp.isOpened():
? ? ? ? r,frame = vp.read()
? ? ? ? if not os.path.exists('cachePic'):
? ? ? ? ? ? os.mkdir('cachePic')
? ? ? ? os.chdir('cachePic')
? ? else:
? ? ? ? r = False
? ? while r:
? ? ? ? number += 1
? ? ? ? cv2.imwrite(str(number)+'.jpg',frame)
? ? ? ? r,frame = vp.read()
? ? os.chdir("..")
? ? return number

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

2.1 創(chuàng)建像素-字符索引

函數(shù)輸入像素RGBA值,輸出對應(yīng)的字符碼。其原理是將字符均勻地分布在整個灰度范圍內(nèi),像素灰度值落在哪個區(qū)間就對應(yīng)哪個字符碼。字符碼可以參考 ASCII碼

ASCII 碼使用指定的7 位或8 位二進制數(shù)組合來表示128 或256 種可能的字符。標準ASCII 碼也叫基礎(chǔ)ASCII碼,使用7 位二進制數(shù)(剩下的1位二進制為0)來表示所有的大寫和小寫字母,數(shù)字0 到9、標點符號,以及在美式英語中使用的特殊控制字符。其中:0~31及127(共33個)是控制字符或通信專用字符(其余為可顯示字符),如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BS(退格)、BEL(響鈴)等;通信專用字符:SOH(文頭)、EOT(文尾)、ACK(確認)等;ASCII值為8、9、10 和13 分別轉(zhuǎn)換為退格、制表、換行和回車字符。它們并沒有特定的圖形顯示,但會依不同的應(yīng)用程序,而對文本顯示有不同的影響。

RGBA是代表Red(紅色)、Green(綠色)、Blue(藍色)和Alpha的色彩空間,Alpha通道一般用作不透明度參數(shù)。如果一個像素的alpha通道數(shù)值為0%,那它就是完全透明的,而數(shù)值為100%則意味著一個完全不透明的像素(傳統(tǒng)的數(shù)字圖像)。gray=0.2126 * r + 0.7152 * g + 0.0722 * b是RGB轉(zhuǎn)為灰度值的經(jīng)驗公式,人眼對綠色更敏感。

def color2Char(r,g,b,alpha = 256):
? ? imgChar= list("#RMNHQODBWGPZ*@$C&98?32I1>!:-;. ")
? ? if alpha:
? ? ? gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
? ? ? unit = 256 / len(imgChar)
? ? ? return imgChar[int(gray / unit)]
? ? else:
? ? ? return ''

2.2 將圖片逐像素轉(zhuǎn)換為字符

核心代碼如下,遍歷圖片的每個像素

? ? img = Image.open(imagePath).convert('RGB').resize((imgWidth, imgHeight),Image.NEAREST)
? ? for i in range(imgHeight):
? ? ? ? for j in range(imgWidth):
? ? ? ? ? ? pixel = img.getpixel((j, i))
? ? ? ? ? ? color.append((pixel[0],pixel[1],pixel[2]))
? ? ? ? ? ? txt = txt + color2Char(pixel[0], pixel[1], pixel[2], pixel[3]) if len(pixel) == 4 else \
? ? ? ? ? ? ? ? ? txt + color2Char(pixel[0], pixel[1], pixel[2])?
? ? ? ? txt += '\n'
? ? ? ? color.append((255,255,255))

3 將字符圖像合成視頻

輸入?yún)?shù)vp是openCV視頻句柄,number是幀數(shù),savePath是視頻保存路徑,函數(shù)中 MP42 是可以生成較小并且較小的視頻文件的編碼方式,其他類似的還有isom、mp41、avc1、qt等,表示“最好”基于哪種格式來解析當前的文件。

def img2Video(vp, number, savePath):
? ? videoFourcc = VideoWriter_fourcc(*"MP42") ?# 設(shè)置視頻編碼器
? ? asciiImgPathList = ['cacheChar' + r'/{}.jpg'.format(i) for i in range(1, number + 1)]
? ? asciiImgTemp = Image.open(asciiImgPathList[1]).size
? ? videoWritter= VideoWriter(savePath, videoFourcc, vp.get(cv2.CAP_PROP_FPS), asciiImgTemp)
? ? for imagePath in asciiImgPathList:
? ? ? ? videoWritter.write(cv2.imread(imagePath))
? ? videoWritter.release()

4 完整代碼

import cv2?
from PIL import Image,ImageFont,ImageDraw
import os
from cv2 import VideoWriter, VideoWriter_fourcc

'''
* @breif: 將像素顏色轉(zhuǎn)換為ASCII字符
* @param[in]: 像素RGBA值
* @retval: 字符
'''
def color2Char(r,g,b,alpha = 256):
? ? imgChar = list("#RMNHQODBWGPZ*@$C&98?32I1>!:-;. ")
? ? if alpha:
? ? ? gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
? ? ? unit = 256 / len(imgChar)
? ? ? return imgChar[int(gray / unit)]
? ? else:
? ? ? return ''
?
'''
* @breif: 將視頻逐幀轉(zhuǎn)換為圖片
* @param[in]: vp -> openCV視頻句柄
* @retval: number -> 轉(zhuǎn)換的圖片數(shù)
'''
def video2Pic(vp):
? ? number = 0
? ? if vp.isOpened():
? ? ? ? r,frame = vp.read()
? ? ? ? if not os.path.exists('cachePic'):
? ? ? ? ? ? os.mkdir('cachePic')
? ? ? ? os.chdir('cachePic')
? ? else:
? ? ? ? r = False
? ? while r:
? ? ? ? number += 1
? ? ? ? cv2.imwrite(str(number)+'.jpg',frame)
? ? ? ? r,frame = vp.read()
? ? os.chdir("..")
? ? return number
?
'''
* @breif: 將圖片逐像素轉(zhuǎn)換為ASCII字符
* @param[in]: imagePath -> 圖片路徑
* @param[in]: index -> 圖片索引
* @retval: None
'''
def img2Char(imagePath, index):
? ? # 初始化
? ? txt, color, font = '', [], ImageFont.load_default().font
? ? imgWidth, imgHeight = Image.open(imagePath).size
? ? asciiImg = Image.new("RGB",(imgWidth, imgHeight), (255,255,255))
? ? drawPtr = ImageDraw.Draw(asciiImg)
? ? imgWidth, imgHeight = int(imgWidth / 6), int(imgHeight / 15)

? ? # 對圖像幀逐像素轉(zhuǎn)化為ASCII字符并記錄RGB值
? ? img = Image.open(imagePath).convert('RGB').resize((imgWidth, imgHeight),Image.NEAREST)
? ? for i in range(imgHeight):
? ? ? ? for j in range(imgWidth):
? ? ? ? ? ? pixel = img.getpixel((j, i))
? ? ? ? ? ? color.append((pixel[0],pixel[1],pixel[2]))
? ? ? ? ? ? txt = txt + color2Char(pixel[0], pixel[1], pixel[2], pixel[3]) if len(pixel) == 4 else \
? ? ? ? ? ? ? ? ? txt + color2Char(pixel[0], pixel[1], pixel[2])?
? ? ? ? txt += '\n'
? ? ? ? color.append((255,255,255))
? ??
? ? # 繪制ASCII字符畫并保存
? ? x, y = 0,0
? ? fontW, fontH = font.getsize(txt[1])
? ? fontH *= 1.37
? ? for i in range(len(txt)):
? ? ? ? if(txt[i]=='\n'):
? ? ? ? ? ? x += fontH
? ? ? ? ? ? y = -fontW
? ? ? ? drawPtr.text((y,x), txt[i], fill=color[i])
? ? ? ? y += fontW
? ? os.chdir('cacheChar')
? ? asciiImg.save(str(index)+'.jpg')
? ? os.chdir("..")

'''
* @breif: 將視頻轉(zhuǎn)換為ASCII圖像集
* @param[in]: number -> 幀數(shù)
* @retval: None
'''?
def video2Char(number):
? ? if not os.path.exists('cacheChar'):
? ? ? ? os.mkdir('cacheChar')
? ? img_path_list = ['cachePic' + r'/{}.jpg'.format(i) for i in range(1, number + 1)]?
? ? task = 0
? ? for imagePath in img_path_list:
? ? ? ? task += 1
? ? ? ? img2Char(imagePath, task)

'''
* @breif: 將圖像合成視頻
* @param[in]: vp -> openCV視頻句柄
* @param[in]: number -> 幀數(shù)
* @param[in]: savePath -> 視頻保存路徑
* @retval: None
''' ?
def img2Video(vp, number, savePath):
? ? videoFourcc = VideoWriter_fourcc(*"MP42") ?# 設(shè)置視頻編碼器
? ? asciiImgPathList = ['cacheChar' + r'/{}.jpg'.format(i) for i in range(1, number + 1)]
? ? asciiImgTemp = Image.open(asciiImgPathList[1]).size
? ? videoWritter= VideoWriter(savePath, videoFourcc, vp.get(cv2.CAP_PROP_FPS), asciiImgTemp)
? ? for imagePath in asciiImgPathList:
? ? ? ? videoWritter.write(cv2.imread(imagePath))
? ? videoWritter.release()
? ??
if __name__ == '__main__':?
? videoPath = 'test.mp4'
? savePath = 'new.avi'
? vp = cv2.VideoCapture(videoPath)
? number = video2Pic(vp)
? video2Char(number)
? img2Video(vp, number, savePath)
? vp.release()

到此這篇關(guān)于 Python 代碼制作動態(tài)鞭炮的文章就介紹到這了,更多相關(guān) Python 制作動態(tài)鞭炮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

5 參考

[1] B站《大二AE結(jié)課作業(yè) 《過 年》(已擺爛)》
[2] https://hongcyu.cn/posts/opencv-pictovideo.html

相關(guān)文章

  • python讀寫csv文件的方法

    python讀寫csv文件的方法

    這篇文章主要介紹了python讀寫csv文件的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-08-08
  • python和c語言哪個更適合初學(xué)者

    python和c語言哪個更適合初學(xué)者

    在本篇文章里小編給大家分享的是一篇關(guān)于python和c語言哪個更適合初學(xué)者的相關(guān)文章,有興趣的朋友們學(xué)習(xí)下。
    2020-06-06
  • python中Requests請求的安裝與常見用法

    python中Requests請求的安裝與常見用法

    Requests是一常用的http請求庫,它使用python語言編寫,可以方便地發(fā)送http請求,以及方便地處理響應(yīng)結(jié)果,下面這篇文章主要給大家介紹了關(guān)于python中Requests請求的安裝與常見用法的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • python學(xué)生管理系統(tǒng)學(xué)習(xí)筆記

    python學(xué)生管理系統(tǒng)學(xué)習(xí)筆記

    這篇文章主要為大家詳細介紹了python學(xué)生管理系統(tǒng)的學(xué)習(xí)筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 基于Flask框架添加多個AI模型的API并進行交互

    基于Flask框架添加多個AI模型的API并進行交互

    這篇文章主要介紹了如何基于 Flask 框架開發(fā) AI 模型 API 管理系統(tǒng),允許用戶添加、刪除不同 AI 模型的 API 密鑰,感興趣的可以了解下
    2025-03-03
  • Python實現(xiàn)找到同名文件并復(fù)制到其他文件夾中

    Python實現(xiàn)找到同名文件并復(fù)制到其他文件夾中

    這篇文章主要為大家介紹了如何基于Python語言,實現(xiàn)依據(jù)某一文件夾中大量文件的名稱復(fù)制另一文件夾中的同名文件,文中的示例代碼簡潔易懂,需要的可以參考一下
    2023-05-05
  • python 求兩個向量的順時針夾角操作

    python 求兩個向量的順時針夾角操作

    這篇文章主要介紹了python 求兩個向量的順時針夾角操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python基礎(chǔ)之while循環(huán)、for循環(huán)詳解及舉例

    python基礎(chǔ)之while循環(huán)、for循環(huán)詳解及舉例

    所謂循環(huán)結(jié)構(gòu)就是程序中控制某條或某些指令重復(fù)執(zhí)行的結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)之while循環(huán)、for循環(huán)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • python實現(xiàn)彩色圖轉(zhuǎn)換成灰度圖

    python實現(xiàn)彩色圖轉(zhuǎn)換成灰度圖

    這篇文章主要為大家詳細介紹了python實現(xiàn)彩色圖轉(zhuǎn)換成灰度圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python描述器descriptor詳解

    Python描述器descriptor詳解

    這篇文章主要向我們詳細介紹了Python描述器descriptor,需要的朋友可以參考下
    2015-02-02

最新評論

长治市| 沙洋县| 道真| 拜城县| 鄂温| 库尔勒市| 柳林县| 波密县| 和龙市| 灵丘县| 普安县| 杭锦后旗| 台东县| 德清县| 栾川县| 邛崃市| 太白县| 垣曲县| 贺兰县| 准格尔旗| 潢川县| 凤凰县| 遂宁市| 张家口市| 青龙| 壤塘县| 诏安县| 中卫市| 桂平市| 静安区| 大庆市| 昭觉县| 霍州市| 武城县| 元朗区| 济南市| 临沭县| 曲靖市| 故城县| 逊克县| 清丰县|