基于Python+OpenCV的视频字符化(深度学习+机器视觉)含全部工程源码

2023-10-27

在这里插入图片描述

前言

本项目利用 OpenCV 提供的轻量、高效的 C++类和 Python 接口,实现了将视频逐帧转换成字符画的功能。通过这个项目,我们可以按照原始格式将图像转换成字符画,并将其应用于视频字符化的场景。

我们使用 OpenCV 提供的功能,将视频文件逐帧读取为图像。然后,我们使用字符集合来代表不同灰度级别的像素值。通过计算每个像素的灰度值,并将其映射到相应的字符,我们可以将图像转换成字符画。

这个项目具有很高的应用价值和趣味性。字符画视频可以应用于艺术创作、视频编辑、社交媒体分享等领域。它可以为视频带来独特的风格和美感,同时也展示了字符处理和图像转换的技术魅力。无论是在个人创作还是商业应用中,视频字符化都可以为用户带来全新的视觉体验。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

本部分包括 Python 和 OpenCV 环境。

Python 环境

需要 Python 3.6 及以上配置,在 Windows 环境下载 Anaconda 完成 Python 所需的配置,
下载地址:https://www.anaconda.com/,也可以下载虚拟机在 Linux 环境下运行代码。

OpenCV环境

在 OpenCV 官方网站 https://opencv.org/下载最新且完整的源码以及大部分 release 版
本源码,链接:https://opencv.org/releases.htm

也可以直接使用下面命令安装:

pip3 install -i https://mirror.aliyun.com/pypi/simple opencv-python==3.4.2.16
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python==3.4.2.16

模块实现

本项目包括 4 个模块:视频读取及处理、色素块识别与替换、视频合成、操作系统上的实现,下面分别给出各模块的功能介绍及相关代码。

1. 视频读取及处理

本部分主要由 OpenCV 的视频导入为主,在代码头部位置引入对应的模块。

import cv2
import os
show_heigth = 30              
show_width = 80
#同时在python prompt中导入OpenCV的库文件
Pip3 install opencv-python
#导入完成后输入pip install进行模块的检查
>>> import cv2
>>> print( cv2.__version__ )
#模块完成后开始视频读取
vc = cv2.VideoCapture(r"C:\Users\Robert\Desktop\01.mp4")
if vc.isOpened():                    
    rval , frame = vc.read()
else:
    rval = False

2. 色素块识别与替换

本部分主要由公式计算、色素块提取及 ASCII 码替换组成。

1)公式计算

图像转字符画需要先将图像转为灰度图,公式:gray = 0.2126 * r + 0.7152 * g + 0.0722 * b,matplotlib 图像的色彩排序是 RGB(opencv 是 BGR),不用库函数,可以使用以下代码实现灰度转换。

for pixel_line in gray:
        for pixel in pixel_line:                 
            text += ascii_char[int(pixel / 256 * char_len )]
        text += "\n"                                
    outputList.append(text)
    frame_count = frame_count + 1

2)色素块提取

确定公式后对色素块提取。

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  #使用opencv转化成灰度图
    gray = cv2.resize(gray,(show_width,show_heigth))#resize灰度图
    text = ""
#具体函数相关代码
template <typename Cvt>
class CvtColorLoop_Invoker : public ParallelLoopBody #定义色素块的类
{
    typedef typename Cvt::channel_type _Tp;
public:
     CvtColorLoop_Invoker(const Mat& _src, Mat& _dst, const Cvt& _cvt) :
        ParallelLoopBody(), src(_src), dst(_dst), cvt(_cvt)
    {
    }
     virtual void operator()(const Range& range) const #给予区块对应的值
    {
        const uchar* yS = src.ptr<uchar>(range.start);
        uchar* yD = dst.ptr<uchar>(range.start);
        for( int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step ) #对原色素块加以循环,实现边际算法
            cvt((const _Tp*)yS, (_Tp*)yD, src.cols);
    }
 private: #将原函数代入总值内
    const Mat& src;
    Mat& dst;
    const Cvt& cvt;
     const CvtColorLoop_Invoker& operator= (const CvtColorLoop_Invoker&);
};

3)ASCII码替换

得到色素块对应值后进行相应的替换,输入ASCII码库。

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
#在输入完成后进行替换
for pixel in pixel_line:                    #字符串拼接
            text += ascii_char[int(pixel / 256 * char_len )]
        text += "\n"

3. 视频合成

完成视频读取、处理、色素块识别与替换,将处理完成的图片进行逐帧拼接,方案如下:

1)使用 CMD 快速循环图片

使用循环函数实现图片的快速切换,将生成的 ASCII 码进行拼接,通过视觉暂留产生视频的表现形式。

frame_count = 0
outputList = []                         #初始化输出列表
while rval:                              #循环读取视频帧  
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  #使用OpenCV转化成灰度图
    gray = cv2.resize(gray,(show_width,show_heigth))#resize灰度图
    text = ""
    for pixel_line in gray:
        for pixel in pixel_line:                    #字符串拼接
            text += ascii_char[int(pixel / 256 * char_len )]
        text += "\n"                                
    outputList.append(text)
    frame_count = frame_count + 1                           
    if frame_count % 100 == 0:
        print("已处理" + str(frame_count) + "帧")
    rval, frame = vc.read()  
print("处理完毕")
for frame in outputList:            
    os.system("cls")                    #清屏
    print(frame)
    print()
    print()

完成后进入CMD中运行并在Python prompt中显示。

CD C://users/Robert/Desktop/
Python 01.py

2)生成相应视频文件

得到 ASCII 码字符集后通过 OpenCV 自带图片视频转化工具实现视频的生成。

def imgs_to_chars(imgs, frames_count): #定义视频合成的帧
	video_chars, i = [], 0
	for img in imgs: #实现画面的切换
		i += 1
		video_chars.append(img_to_chars(img, i/frames_count))
	return video_chars
"""	测试 imgs_to_chars
if __name__ == "__main__":
	imgs = Video_to_imgs("BadApple.mp4", (64, 48))      #导入视频的存储位置
	video_chars = imgs_to_chars(imgs)
	assert len(video_chars) > 10
"""
def play_video(video_chars, frame_rate, frames_count): #定义视频的播放方案
	import time
	import curses
	width,height = len(video_chars[0][0]), len(video_chars[0])#获取文件尺寸
	stdscr = curses.initscr()
	curses.start_color()                          #定义开始的色素块
	try:
		stdscr.resize(height, width * 2)
		for pic_i in range(len(video_chars)):
			for line_i in range(height):        #打印当前帧
				stdscr.addstr(line_i, 0, video_chars[pic_i][line_i], curses.COLOR_WHITE)                                      #打印显示,并将字符调整为白色
			stdscr.refresh()
			time.sleep(1 / frame_rate)
	finally:
		curses.endwin()
	print("播放完毕")
	return

通过比较得出方法一的运行速度高于方法二,同时节省了模块的调用,所以使用第一种方案进行视频的获取。

4. 操作系统上的实现

本部分包括确定文件地址与格式要求。

1)确定文件地址

代码中明确了文件的对应地址。

vc = cv2.VideoCapture(r"C:\Users\Robert\Desktop\01.mp4")#加载一个视频
if vc.isOpened():                                               #判断是否正常打开
    rval , frame = vc.read()
else:
    rval = False
#在实际运用时只需要修改对应地址即可
def get_video_chars(video_path, size, seconds):
	video_dump = get_file_name(video_path) + ".pickle" #实现视频的帧数循环
	if has_file(".", video_dump):
		print("正在读取")
		video_chars, fps, frames_count = load(video_dump)
	else:
		print("正在加载,请稍等")
		imgs, fps, frames_count = Video_to_imgs(video_path, size, seconds)
		video_chars = imgs_to_chars(imgs, frames_count)
		dump([video_chars, fps, frames_count], video_dump)
		print("加载完成")
	return video_chars, fps, frames_count
if __name__ == "__main__":
	try:
		video_path = sys.argv[1]
	except:
		video_path = ""
	if video_path == "":
		video_path = input("输入视频地址:")
	main(video_path)
	exit()

2)格式要求

根据 OpenCV 的要求得出相应的格式。推荐 MP4 与 MKV,分辨率可以根据窗体进行自动调节。文件大小并不影响代码的运行速度,鉴于是逐帧提取,时长由影视文件长度决定。

MPEG-4 包含 MPEG-1 及 MPEG-2 的绝大部分功能及其他格式的长处,加入并扩充对虚拟现实模型语言(VRML、VirtualReality Modeling Language)的支持,面向对象的合成档案(包括音效、视讯及 VRML 对象)、数字版权管理(DRM)及其他互动功能。

Matroska 多媒体容器(Multimedia Container)是开放标准容器和文件格式、多媒体封装格式,能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道。所以不是压缩格式,而是 Matroska 定义的一种多媒体容器文件。其目标是作为一种统一格式保存常见的电影、电视节目等多媒体内容。

系统测试

如图所示,通过对代码 ASCII 转化,识别出的图片可以辨别出原图。鉴于该代码主要是针对视频运行,更多的是对视频效果的参考。

在这里插入图片描述

工程源代码下载

详见本人博客资源下载页

其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Python+OpenCV的视频字符化(深度学习+机器视觉)含全部工程源码 的相关文章

随机推荐

  • B站视频下载(含bv快速变回av)

    下载解压JJDown的软件 打开如下应用程序 JiJiDownForWPF打开首页 原本B站中的每个视频有对应的av号但从2020 3起全都变为bv号 所以如何从bv号中查看av号 谷歌浏览器中打开要下载的B站视频 按F12 开发者工具 选
  • Python#Typora-Python笔记

    01 源码安装Python3 一 源码安装 安装依赖软件包 root qfedu com yum groupinstall Development Tools root qfedu com yum y install zlib devel
  • 日语动词的13种变形

    五段动词 一类动词 辞书形 形 形 形 形 意志形 可能形 行 行 行 行 行 行 行 書 書 書 書 書 書 書 買 買 買 買 買 買 買 假定形 被动形 使役形 命令形 禁止形 被役形 行 行 行 行 行 行 書 書 書 書 書 書
  • 【linux】内核组件 [不断补充中...]

    防火墙 netfilter iptables IP 信息包过滤系统 netfilter 内核空间 kernelspace 是内核的一部分 由一些信息包过滤表组成 这些表包含内核用来控制信息包过滤处理的规则集 即 存放内核过滤规则的防火墙 i
  • GridView 使用方法详解

    GridView 跟ListView 很类似 Listview 主要以列表形式显示数据 GridView 则是以网格形式显示数据 掌握ListView 使用方法后 会很轻松的掌握GridView的使用方法 欢迎关注微信公众号 程序员Andr
  • DBeaver导入csv数据到Oracle

    时隔许久 我又回来写博客啦 前段时间太忙了 绝对不是因为懒才没有写的 大实话 今天用到csv存库的问题 踩了点坑 做个笔记 废话不多说我们开始 第一步 打开DBeaver 右键点击要导入数据的表 选择 导入数据 第二步 点击csv 下一步
  • 反射 动态代理 线程池

    反射 动态代理 线程池 反射 动态获取类的字节码文件 并对其进行抽象 通过反射可以获取一个类的全部方法和属性 然后进行调用 反射与类之间抽象的理解 Class 将字节码对象进行抽象 出现了 1 属性 表示字节码文件的属性的属性 privat
  • PDF阅读时如何返回到跳转之前的位置

    方法 同时按下Alt 左箭头
  • 中国航天科技集团公司的各个研究院

    1 航天一院 中国运载火箭技术研究院 导弹运载火箭总体设计生产总装 2 航天四院 航天动力技术研究院 航天固体燃料发动机研制生产实验 3 航天五院 中国空间技术研究院 卫星 飞船 空间站 探月器等航天器研制生产 4 航天六院 航天推进技术研
  • el+vue 实战 ⑧ el-calendar日历组件设置点击事件、el-calendar日历组件设置高度、el-calendar日历组件自定义日历内部内容

    一 效果图 日历显示内容变为01 02的形式 点击相应的日期后 有一个弹出框显示当天完成的一些内容 二 前端代码设置
  • 切换到WSL2.0后无法连接到x-server Unable to init server: Could not connect: Connection refused无法显示窗口

    之前通过安装vcxsrv 64 1 20 9 0 installer exe 启动x launch服务器后 无法通过bash打开显示窗口 错误 Unable to init server Could not connect Connecti
  • 【Javascript】数据结构与算法-快速排序第一趟结果

    Javascript 数据结构与算法 快速排序第一趟结果 整体思想 案例一 案例二 快速排序代码实现 js 复杂度分析 整体思想 将待排序数组A以某一元素为基准划分为两个子数组left和right 如果基准元素为pivot那么left中的元
  • 山路 (ghat)--(最短路-最小生成树//超级原点)

    感谢光神送来rating38000分的思路 题目描述 会和神奈子一起改变地形 开凿地下洞穴等 虽说是一起 不过看起来改变土地是诹访子的工作 与其说她是直接将大地整平 不如说这是她麾下的崇神的功劳 求闻口授 山路交错相同 令人烦躁 于是诹访子
  • MWeb发布笔记到印象笔记,提示“Content of submitted note was malformed”

    文章目录 issue solution 参考 issue MWeb发布笔记到印象笔记 提示 Error Domain com evernote sdk Code 11 Content of submitted note was malfor
  • 解决m1芯片Mac安装node失败问题

    用nvm安装node时终端报错 type aesni cbc sha256 enc avx2 function deps openssl config archs linux x86 64 asm avx2 crypto aes aesni
  • C/C++笔试必须熟悉掌握的头文件系列(五)——iostream

    1 说明 iostream 的意思是输入输出流 直接点说就是in out stream 流 从字面就可以理解这个函数库所要操作的无非是从流中获取输入 向终端流中输出 iostream 库的基础是两种命名为 istream 和 ostream
  • 清除IEXPLORER.EXE病毒

    E枭雄 Trojan Nethief IExplorer 病毒档案 网络枭雄 病毒的一个新变种 值得关注 警惕程度 发作时间 随机 病毒类型 木马病毒 传播方式 网络 感染对象 网络 病毒介绍 此 病毒是网络枭雄病毒的一个新变种 可以在Wi
  • vue中如何引入jquery详解

    用vue cli脚手架工具构建项目成功后 当需要引入JQ 可用以下方法 1 首先在package json里的dependencies加入 jquery 3 2 1 2 在终端里输入npm install jquery save dev 当
  • Reid Strong Baseline 代码解析

    目录 1 设置自己的数据集 1 1使用作者提供的dataset格式 1 2新建dataset格式 2 测试时设置是否只采用跨相机的样本 3 训练 3 1 修改模型 3 1 1参数解读 3 1 2使用自己的模型 4测试 5本篇博客的不足 1
  • 基于Python+OpenCV的视频字符化(深度学习+机器视觉)含全部工程源码

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 Python 环境 OpenCV环境 模块实现 1 视频读取及处理 2 色素块识别与替换 3 视频合成 4 操作系统上的实现 系统测试 工程源代码下载 其它资料下载 前言 本项目利