广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现蓝线挑战特效的示例代码
  • 174
分享到

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

2024-04-02 19:04:59 174人浏览 独家记忆

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

--结束END--

本文标题: Python实现蓝线挑战特效的示例代码

本文链接: https://www.lsjlt.com/news/120717.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现蓝线挑战特效的示例代码
    目录1. 摄像头版本       2. 视频处理版本在抖音曾经火了一阵子的蓝线挑战特效,其原理很简单:在蓝线经过后保留本帧的部分像素,形成蒙板...
    99+
    2022-11-11
  • C++OpenCV实现抖音"蓝线挑战"特效
    目录前言一、图像扫描二、生成定格图像三、图像混合四、效果显示五、源码总结前言 本文将使用OpenCV C++ 实现抖音上的特效“蓝线挑战”。虽然看起来觉得很牛...
    99+
    2022-11-12
  • python实现线性回归的示例代码
    目录1线性回归1.1简单线性回归1.2 多元线性回归1.3 使用sklearn中的线性回归模型1线性回归 1.1简单线性回归 在简单线性回归中,通过调整a和b的参数值,来拟合从x到...
    99+
    2022-11-13
  • Python实现屏幕代码雨效果的示例代码
    直接上代码 import pygame import random def main(): # 初始化pygame pygame.init() #...
    99+
    2022-11-13
  • Python实现蒙特卡洛模拟的示例代码
    目录什么是蒙特卡洛模拟Python实现今天呢,田辛老师来给大家继续讲一个著名的项目管理工具:蒙特卡洛模拟。 当然,田辛老师既然发到CSDN上面,无论如何要给出关于蒙特卡洛模拟的Pyt...
    99+
    2023-03-13
    Python实现蒙特卡洛模拟 Python蒙特卡洛模拟
  • 基于JS实现动态跟随特效的示例代码
    目录演示技术栈源码css部分js部分演示 技术栈 这次用到了关于css的一些功能,和jQuery。 CSS3中添加的新属性animation是用来为元素实现动画效果的,但是anim...
    99+
    2022-11-13
  • Python实现希尔伯特变换(Hilberttransform)的示例代码
    目录前言一、希尔伯特变换是什么二、VC中的实现原理及代码示例三、用Python代码实现总结前言 在数学和信号处理中,**希尔伯特变换(Hilbert transform)**是一个对...
    99+
    2023-05-15
    Python实现希尔伯特变换 Python希尔伯特变换
  • 基于Python实现烟花效果的示例代码
    python烟花代码 如下 # -*- coding: utf-8 -*- import math, random,time import threading import tki...
    99+
    2022-11-13
  • Python实现图像去雾效果的示例代码
    目录修改部分训练测试数据集下载地址修改部分 我利用该代码进行了去雾任务,并对原始代码进行了增删,去掉了人脸提取并对提取人脸美化的部分,如下图 增改了一些数据处理代码,Create_...
    99+
    2022-11-13
  • python实现字母闪烁效果的示例代码
    目录1. 介绍2. 完整代码效果图 1. 介绍 屏幕上随机闪烁的代码块,一定能满足我们对于电影中黑客的一丝丝设想,这次,让我们用简简单单的30行python代码,实现这个效果。 前...
    99+
    2022-11-11
  • Python快速实现一个线程池的示例代码
    目录楔子Future 对象提交函数自动创建 Future 对象future.set_result 到底干了什么事情提交多个函数使用 map 来提交多个函数按照顺序等待执行取消一个函数...
    99+
    2022-11-11
  • Java实现线程插队的示例代码
    目录多线程5(线程插队)1.题目2.解题思路3.代码详解多线程5(线程插队) 1.题目 在编写多线程的业务时,会遇到让一个线程优先于其他线程运行的情况,除了可以设置线程的优先级高于其...
    99+
    2022-11-13
  • AndroidFlutter实现点赞效果的示例代码
    目录前言绘制小手完整源码前言 点赞这个动作不得不说在社交、短视频等App中实在是太常见了,当用户手指按下去的那一刻,给用户一个好的反馈效果也是非常重要的,这样用户点起赞来才会有一种强...
    99+
    2022-11-13
  • JS实现飞机大战小游戏的示例代码
    小编给大家分享一下JS实现飞机大战小游戏的示例代码,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!先制作好要做好的几步以及背景样式var canvas = document.getElement...
    99+
    2023-06-15
  • Java实现游戏飞机大战-III的示例代码
    目录前言主要设计功能截图代码实现游戏面板类商店类总结前言 《飞机大战-III》是一款融合了街机、竞技等多种元素的经典射击手游。华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾...
    99+
    2022-11-13
  • Java实现在线预览的示例代码(openOffice实现)
    简介之前有写了poi实现在线预览的文章,里面也说到了使用openOffice也可以做到,这里就详细介绍一下。 我的实现逻辑有两种: 一、利用jodconverter(基于OpenOffice服务)将文件(.doc、.docx、.xls、.p...
    99+
    2023-05-30
    java openoffice ava
  • C++单例模式实现线程池的示例代码
    C语言单例模式实现线程池。 该代码中,使用了单例模式来创建线程池对象,保证了整个程序中只有一个线程池对象。 线程池中包含了任务队列、工作线程数组、互斥锁、条件变量等成员,通过这些成员...
    99+
    2023-05-16
    C++单例模式实现线程池 C++单例模式 线程池 C++ 线程池 C++ 单例模式
  • Qt实现对齐线功能的示例代码
    目录现有功能运行结果源码button.hbutton.cppwindow.hwindow.cppmain.cpp现有功能 1.添加任意数量的按钮。 2.移动按钮,通过对齐线来设置按钮...
    99+
    2022-11-13
  • Matlab实现绘制玫瑰线的示例代码
    目录绘制效果基础代码土味代码绘制效果 实际上就是在进行曲线: 的可视化,代码非常简单哈: 基础代码 function roseCurve1 set(gcf,'position'...
    99+
    2022-11-13
  • python实现多线程并得到返回值的示例代码
    目录一、带有返回值的多线程1.1 实现代码1.2 结果二、实现过程2.1 一个普通的爬虫函数2.2 一个简单的多线程传值实例2.3 实现重点三、代码实战四、学习一、带有返回值的多线程...
    99+
    2022-11-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作