Python实现蓝线挑战特效的示例代码

目录
  • 1. 摄像头版本
  • 2. 视频处理版本

在抖音曾经火了一阵子的蓝线挑战特效,其原理很简单:在蓝线经过后保留本帧的部分像素,形成蒙板图片,未经过处照常切换帧图片,再将蒙版图片贴到每帧图片上。本着我上我也行的想法,试着用opencv-python实现这个效果,做了摄像头版本和视频处理版本。

图源:抖音

图源: PPT

1. 摄像头版本

从上述描述可知,在摄像头版本中可规定每帧取固定宽度像素,如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} 输出完成!")

2. 视频处理版本

与摄像头版本不同,视频版本需要获取视频信息以做处理。

(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蓝线挑战特效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 火遍全网的Python二次元特效轻松掌握

    导语 昨天下班,回家吃完饭就直接躺了,无聊的时候大家都会干什么呢? 当然是刷刷刷--抖音啦,嗯哼,然后返现了抖音上一款特效--「变身漫画」,简直好看到不行. 从明星到路人,堪称全民参与,刷了很多类似的视频发现效果竟然这么好看,来看下效果吧~ 登场的是张艺兴和戚薇. 可以看到,这个特效基于人物的面容,很好的转换成了二次元漫画风格. 尤其是眼睛的处理,把张艺兴慵懒的眼神.戚薇水汪汪的大眼睛,诠释的淋漓尽致. 当然发型也都是「满分转换」,分叉.造型等细节可以说是丝毫不差了. 突破「次元壁」的关键技术:

  • 利用Python实现好看的水波特效

    目录 前言 一.运行环境 二.效果展示 1)第一组随机风景图 2)第二组人物随机图 3)第三组真人图片 三.代码展示 前言 你的心要如溪水般柔软,你的眼波要像春天般明媚. ——余光中 ​似乎很少看见湍急的溪流,多数时候,溪水总是潺潺地流着,不疾不徐,有自己的节奏: 也似乎很少看见污浊的溪流,多数时候,溪水总是澄澈见底,偶尔拔起沙石,也很快能静置溪底,重归明净. 一个像溪水的人,多半是通透清明的,他知道如何过滤掉和沉落生命中的杂质,以一颗澄澈的心,往自己的方向流去. 描写了这么多关于水的诗句,你是

  • Python 实现图像特效中的油画效果

    目录 一 基本原理 二 代码实现 三 总体实现代码以及保存  在前面的文章Python 计算机视觉(十五)-- 图像特效处理中我已经介绍了大部分的图像的特效处理,但还是忽略了油画特效的处理,在本篇文章中简单介绍一下油画特效的基本原理以及代码实现,感兴趣的小伙伴可以跟着码一遍代码,或者使用代码直接运行查看一下效果就行. 一 基本原理 如下面的两幅图所示,油画用对了地方会使得图像一下子显得文艺起来了呢! 拍出的图像 转化为油画 那么将一幅图像转化为油画类型的图案是怎么实现的呢?为了将一幅普通的图像转

  • Python实现为图像添加下雪特效

    目录 导语 正文 一.故宫下雪了:界面小程序 1)附主程序 2)效果展示 二.故宫下雪了:手绘素描 1)主程序 2)效果展示 导语 也许是为了和音,在立冬这一天的人间里 北方多个城市,悄然降下冬天的第一场初雪,组成了一段旋律 一天过两季,黄叶转飞花--从天而降落,昼夜不停,一夜醒来,阁檐染白,故宫完成秋冬交接, 来自北方的故事纷纷踏雪而来. 琼楼银装,粉饰玉砌,不觉恍入天上仙境,宫墙内宾客如云,宫墙外车水马龙,若把故宫作天宫, 整夜冬天不觉冷.(可以穿秋裤了.jpg) (本文的部分素材是在北京故

  • Python实现蓝线挑战特效的示例代码

    目录 1. 摄像头版本 2. 视频处理版本 在抖音曾经火了一阵子的蓝线挑战特效,其原理很简单:在蓝线经过后保留本帧的部分像素,形成蒙板图片,未经过处照常切换帧图片,再将蒙版图片贴到每帧图片上.本着我上我也行的想法,试着用opencv-python实现这个效果,做了摄像头版本和视频处理版本. 图源:抖音 图源: PPT 1. 摄像头版本 从上述描述可知,在摄像头版本中可规定每帧取固定宽度像素,如2个像素,假设视频尺寸为640*480,则需要480/2=240帧,若视频帧率(每秒的帧数)为30,则运

  • C++ OpenCV实现抖音"蓝线挑战"特效

    目录 前言 一.图像扫描 二.生成定格图像 三.图像混合 四.效果显示 五.源码 总结 前言 本文将使用OpenCV C++ 实现抖音上的特效“蓝线挑战”.虽然看起来觉得很牛的样子,但如果了解其中的原理就非常简单了.本案例是我自己对于这个特效实现过程的理解,仅供参考. 算法原理可以分为三个流程: 1.将视频(图像)从(顶->底)或(左->右)逐行(列)扫描图像. 2.将扫描完成的行(列)像素重新生成定格图像. 3.使用原帧图像像素填充未扫描到的像素. 接下来就具体来看看是如何实现的吧. 一.图

  • python 模拟在天空中放风筝的示例代码

    1 前言 昨天是农历的三月初三,相传这一天是轩辕黄帝的诞辰日.春秋时期,三月初三的纪念活动还是非常隆重的,至魏晋则演变为达官显贵.文人雅士临水宴饮的节日.兰亭序中提到的"曲水流觞",也许就是这一习俗的写照吧(个人猜想,未经考证).唐以后,三月初三渐渐湮没于历史的长河中. 于我而言,三月初三却是一个放风筝的日子.每逢这一天,耳边总会响起一首老歌:又是一年三月三,风筝飞满天--上班路上,看道路两侧草长莺飞.杨柳拂面,一时玩心顿起:何不用3D构造一个天上白云飘飘,地上绿草茵茵的虚幻空间,在里

  • Python&Matlab实现灰狼优化算法的示例代码

    目录 1 灰狼优化算法基本思想 2 灰狼捕食猎物过程 2.1 社会等级分层 2.2 包围猎物 2.3 狩猎 2.4 攻击猎物 2.5 寻找猎物 3 实现步骤及程序框图 3.1 步骤 3.2 程序框图 4 Python代码实现 5 Matlab实现 1 灰狼优化算法基本思想 灰狼优化算法是一种群智能优化算法,它的独特之处在于一小部分拥有绝对话语权的灰狼带领一群灰狼向猎物前进.在了解灰狼优化算法的特点之前,我们有必要了解灰狼群中的等级制度. 灰狼群一般分为4个等级:处于第一等级的灰狼用α表示,处于第

  • vue 粒子特效的示例代码

    本文介绍了vue 粒子特效的示例代码,分享给大家,具体如下: 实现效果: 没错,你看到的上图那些类似于星座图的点和线,是由vue-particles生成的,而且能与用户鼠标事件产生互动. 传送门:vue-particles 使用教程 npm install vue-particles --save-dev main.js文件: import Vue from 'vue' import VueParticles from 'vue-particles' Vue.use(VueParticles)

  • Python实现邮件的批量发送的示例代码

    1 发送文本信息 '''加密发送文本邮件''' def sendEmail(from_addr,password,to_addr,smtp_server): try: msg = MIMEText('你好,来自信息化工程所的问候...', 'plain', 'utf-8') # 文本邮件 # msg = MIMEText('<html><body><h1>你好</h1>' + '<p>send by <a href="http:/

  • 使用electron制作满屏心特效的示例代码

    本文介绍了使用electron制作满屏心特效的示例代码,分享给大家,具体如下: 图片被压缩了 看起来很难看 主进程代码 import {BrowserWindow, app, ipcMain} from 'electron' createWindow(); ipcMain.on('quitApp', () => { app.quit(); }); function createWindow() { const loginURL = process.env.NODE_ENV === 'develo

  • python画双y轴图像的示例代码

    很多时候可能需要在一个图中画出多条函数图像,但是可能y轴的物理含义不一样,或是数值范围相差较大,此时就需要双y轴. matplotlib和seaborn都可以画双y轴图像. 一个例子: import seaborn as sns import matplotlib.pyplot as plt # ax1 for KDE, ax2 for CDF f, ax1 = plt.subplots() ax1.grid(True) # ax1.set_ylim(0, 1) ax1.set_ylabel('

  • 用python实现刷点击率的示例代码

    背景 同事的老爸参加微信的一个活动,需要刷点击率,因此,写了一个程序助之. 准备 微信活动也是有真实地址的. 通过mitmproxy(man in the middle proxy)的方式,可以获取微信获取网页的真实地址(url). 完整可运行代码 import os import time import argparse import platform def visit_win(url, times, duration): import urllib2 def _visit_win(): t

  • Python Learning 列表的更多操作及示例代码

    遍历列表-for循环 列表中存储的元素可能非常多,如果想一个一个的访问列表中的元素,可能是一件十分头疼的事.那有没有什么好的办法呢?当然有!使用 for循环 假如有一个食物名单列表,通过 for循环 将列表中的食物名称都打印出来 # 定义一个食物名单列表 foods = ['potato', 'tomato', 'noodles', 'apple', 'pizza'] # 循环访问foods列表 for food in foods: print(food) 输出: potato  tomato 

随机推荐