<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在抖音曾經火了一陣子的藍線挑戰特效,其原理很簡單:在藍線經過後保留本幀的部分畫素,形成蒙板圖片,未經過處照常切換幀圖片,再將蒙版圖片貼到每幀圖片上。本著我上我也行的想法,試著用opencv-python實現這個效果,做了攝像頭版本和視訊處理版本。
圖源:抖音
圖源: PPT
從上述描述可知,在攝像頭版本中可規定每幀取固定寬度畫素,如2個畫素,假設視訊尺寸為640*480,則需要480/2=240幀,若視訊影格率(每秒的幀數)為30,則執行8秒,實際受計算速度等影響會略大於這個值,以下為關鍵部位程式碼:
(1)從攝像頭獲取每幀影象
video = CV2.VideoCapture(0, CV2.CAP_DSHOW) ret, frame = video.read() # frame為np陣列,寬100高200時,陣列形狀為200 * 100 *3 frame = CV2.flip(frame,1) # 左右翻轉影象為映象
(2)製作蒙版圖片,並取每幀的固定數量的畫素
#通過row_index記錄當前的行索引,獲取畫素作為蒙版圖片 canvas[row_index:row_index + pixel_number_each_frame] = frame[row_index:row_index + pixel_number_each_frame] row_index += pixel_number_each_frame # 每次執行增加固定畫素寬度 if row_index + width_blueline < hight: # 避免因為增加固定畫素,導致超出影象的高度 frame[:row_index] = canvas[:row_index] # 將每幀的影象上部替換為蒙版圖片 frame[row_index:row_index+ width_blueline] = array_blueline # 新增藍線矩陣 # 視窗顯示,BUG在於frame資料為浮點數時預設RGB數值範圍0~1,當為整數時為0~255 CV2.imshow('Viewer', frame / 255)
(3)將處理完的圖片及時儲存,便於後期匯出視訊
CV2.imwrite(f'{output_frame_dirpath}/{count}.jpg', frame)
(4)合成視訊
def img_to_video(output_video_path, frame_dirpath, fps): """ 將處理好的幀圖片合成視訊 :param output_video_path: 輸出視訊的地址 :param frame_dirpath: 幀圖片所在資料夾地址 :param fps: 輸出影格率 :return: None """ img = CV2.imread(f"{frame_dirpath}/1.jpg") hight, width, _ = img.shape fourcc = CV2.VideoWriter_fourcc(*'mp4v') videoWriter = CV2.VideoWriter(output_video_path, fourcc, fps, (width, hight)) order = [int(i.strip(".jpg")) for i in os.listdir(frame_dirpath) if i.endswith(".jpg")] jpglist = [f"{frame_dirpath}/{i}.jpg" for i in sorted(order)] for i, jpg in enumerate(jpglist): img = CV2.imread(filename=jpg) videoWriter.write(img) print(f"將字元畫寫入視訊, 進度{(i + 1)}/{len(jpglist)}!") videoWriter.release() print(f"{output_video_path} 輸出完成!")
與攝像頭版本不同,視訊版本需要獲取視訊資訊以做處理。
(1)將視訊抽幀為圖片
def video_to_img(frame_dirpath, video_path): """ 將視訊抽取為幀圖片以便處理 :param frame_dirpath: 存放抽取好的幀圖片資料夾地址 :param video_path: 視訊地址 :return: None """ vc = CV2.VideoCapture(video_path) c = 0 ret = vc.isOpened() while ret: c += 1 ret, frame = vc.read() if ret: CV2.imwrite(f'{frame_dirpath}/{c}.jpg', frame) print(f'生成{frame_dirpath}/{c}.jpg') else: break vc.release() print("視訊按各幀提取完成!")
(2)獲取視訊基本資訊
def get_video_msg(video_path): """ 獲取視訊的基本資訊 :param video_path: 視訊地址 :return: [幀數量,[寬度,高度],影格率] """ cap = CV2.VideoCapture(video_path) if cap.isOpened(): frame_number = cap.get(7) width = cap.get(3) hight = cap.get(4) fps = cap.get(5) return [frame_number, [width, hight], fps] return [-1, -1, -1, [-1, -1], -1]
(3)計算相關引數。新視訊的時長即為掃描時長,即每幀抽取畫素= 圖片高度 / 總幀數,此時需要取整,且取整誤差=圖片高度 - 每幀抽取畫素* 總幀數,不處理會導致藍線無法在時長內掃描完整個高度。
array_blueline = np.array([[[255, 255, 0] for _ in range(width)] for _ in range(width_blueline)]) pixel_number_each_frame = int(hight / frame_number) # 每次取幀擷取的畫素範圍 err = hight - pixel_number_each_frame * frame_number - 3 # 誤差值分散到每幀,留3個畫素給藍線
(4)將誤差分散到較前的幀圖片中
if err_count < err: canvas[row_index:row_index + pixel_number_each_frame + 1] = img[row_index:row_index + pixel_number_each_frame + 1] row_index += pixel_number_each_frame + 1 err_count += 1 # 計算誤差部分是否使用完 else: canvas[row_index:row_index + pixel_number_each_frame] = img[row_index:row_index + pixel_number_each_frame] row_index += pixel_number_each_frame if row_index + width_blueline <= hight: # 避免索引跑出圖片範圍而報錯 img[:row_index] = canvas[:row_index] img[row_index:row_index+ width_blueline] = array_blueline
(5)將圖片重新合成視訊,同攝像頭版本,不再贅述
到此這篇關於Python實現藍線挑戰特效的範例程式碼的文章就介紹到這了,更多相關Python藍線挑戰特效內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45