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

news2024/9/20 9:42:07

目录

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

在这里插入图片描述

前言

本项目利用 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相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据平台流量回放最佳实践|精选

1.1 数据平台业务背景 数据平台利用大数据智能分析、数据可视化等技术&#xff0c;对公司内外部经过采集、建设、管理、分析的多源异构数据进行呈现和应用&#xff0c;实现了数据共享、日常报表自动生成、快速和智能分析&#xff0c;深度挖掘数据价值&#xff0c;满足企业各级…

Leetcode48 旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出…

ZYNQ——按键消抖实验

文章目录 原理简介软件仿真板上验证 原理简介 按键作为基本的人机输入接口&#xff0c;在很多电子设计中都是比较常见的&#xff0c;但是由于其机械特性&#xff0c;在按键按下或者松开的时候&#xff0c;按键的输入值是有抖动的。按键的抖动是其固有特性&#xff0c;因此无论…

打死也不要进外包,来看看我在腾讯外包的这2年......

我18年毕业于一个普通二本学校&#xff0c;是一个很不出名的小本科。大学期间专业知识也没有去认真的学习&#xff0c;所以毕业的时候就随便找了一份工作&#xff0c;在一个小公司做功能测试。 记得那时候薪资大概是6k左右&#xff0c;因为是在工厂&#xff0c;工作环境很差&a…

Gitlab 访问令牌更新 替换

引言 访问令牌到期后如何丝滑更换&#xff0c;或则如何更改账户的访问令牌实现权限变动呢&#xff1f;在我们使用访问令牌克隆项目之后&#xff0c;Windows凭据就帮我们记录下了密码。当然密码是不可见的&#xff0c;只能进行删除重新设置&#xff0c;通过凭据管理器进行更改。…

python基于预训练大模型权重实现文本向量化开发构建微博评论数据情感极向识别模型

因为最近的一些项目涉及到了大模型相关的技术开发研究&#xff0c;在我前面的博文中也已经有一些实践记录学习资料分享的文章了&#xff0c;今天是在做模型训练的时候突然想到一个有意思的想法&#xff0c;按照我之前做文本分类的方法&#xff0c;基本主流的技术路线都是先对文…

性能提升571%,32K超长上下文,推理速度提升42%,允许商用,国产开源大模型推出了二代 ChatGLM2-6B...

6月份是火热的夏天&#xff0c;各种火热的 AI 产品也在密集的更新&#xff0c;天越热&#xff0c;大家是干得热火朝天&#xff0c;卷出了新高度。 前有现在大火的 ChatGPT&#xff0c;ChatGPT 更新&#xff1a;大杀器&#xff01;函数调用示范&#xff0c;ChatGPT 3.5/4 双双升…

Java Web JDBC(2)23.6.26

3.6 PreparedStatement PreparedStatement作用&#xff1a; 预编译SQL语句并执行&#xff1a;预防SQL注入问题 3.6.1 代码模拟SQL注入问题 Test public void testLogin() throws Exception {//2. 获取连接&#xff1a;如果连接的是本机mysql并且端口是默认的 3306 可以简化书…

浅谈无线温度监测系统在冶炼厂供配电的应用

安科瑞 华楠 摘要&#xff1a;高压供配电系统运行稳定性与电气元器件连接点温度密切相关&#xff0c;通过与传统测温方法对比&#xff0c;实时在线无线温度监测解决 了密封高压开关柜内部各连接点温度无法检测的难题&#xff0c;满足了供电系统安全稳定运行的要求&#xff0c;降…

redis 主从复制 哨兵 安装部署

学习开始前先了解一下 Redis是一个开源的内存数据结构存储系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。Redis最大的特点是数据存储在内存中&#xff0c;因此读写速度非常快&#xff0c;同时也支持数据持久化&#xff0c;可以将数…

吐血整理,接口自动化测试-Config配置文件框架封装(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 configparser的介…

阿里巴巴2023最新版Spring Security王者晋级文档

Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 是 Spring 家族中的一个安全管理框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。在用户认证方面&#xff0c;Spring Security 框架支持主流的认证方式&#xff0c;包括 HTTP 基本认证、HTTP 表单…

输出一个数的十六进制表示

可以使用Integer.toHexString、Long.toHexString得到数值的十六进制表示。 下面的代码示例列出了几种情况&#xff1a; public class Test5 {public static void main(String[] args) {byte b1 0b01101111; System.out.println(Integer.toHexString(b1).toUpperCase());byte…

深度学习的实践层面

目录 1、训练、验证、测试集 2、偏差、方差 3、正则化 4、dropoout正则化 5、其他正则化方法 6、归一化输入 7、梯度消失和梯度爆炸 8、梯度的数值逼近 9、梯度检验 1、训练、验证、测试集 &#xff08;1&#xff09;、早期机器学习领域普遍认可的最好的实践方法&…

海兰一体机电脑U盘重装Win10系统教程图解

海兰一体机电脑是全家人都适用的电脑&#xff0c;使用海兰一体机电脑的用户要怎么用U盘来重装Win10系统&#xff0c;首先用户需要确保电脑能够正常联网&#xff0c;然后再准备一个8G以上的U盘&#xff0c;最后根据小编分享的海兰一体机电脑U盘重装Win10系统教程图解操作即可。 …

PR脚本:音乐鼓点自动节拍打点标记动画BeatEdit

BeatEdit可检测音乐中的节拍并在Premiere Pro时间轴中为其生成标记。可以创建与音乐同步的自动编辑&#xff0c;或者让BeatEdit v2.0.006 激活版协助您进行手动编辑过程。BeatEdit mac版使用节拍信息来生成与音乐同步的全自动编辑。如果需要更多控制&#xff0c;拍子标记也可以…

视唱音准不好的人能练好吗,视唱音准不好怎么办

软件版本&#xff1a;Earmaster7.3.6 无论是普通人还是声乐艺术生&#xff0c;音准是唱好歌的必要条件之一&#xff0c;如果音准不好&#xff0c;唱歌自然会跑调。然而并不是所有人天生都有十分出色的音准&#xff0c;如果不进行后天的训练&#xff0c;是很难找到正确的音准的…

web应用封装成app|超级签名

PP封装是形成APP的最省钱的一种方式。你只需要拥有一个网址就可以通过一些技术处理封装成一个跨iOS和Android的APP&#xff0c;这个过程往往只需要几分钟。在移动互联网时代&#xff0c;拥有一个移动端APP是必不可少的。那么APP是怎样封装的呢&#xff1f; 首先让我们先来了解…

基于深度学习的人脸面部表情识别系统【含Python源码+PyqtUI界面+原理详解】

功能演示 摘要&#xff1a;面部表情识别&#xff08;Facial Expression Recognition&#xff09;是一种通过技术手段识别人物图像中人脸面部表情的技术。本文详细介绍了其实现的技术原理&#xff0c;同时给出完整的Python实现代码、训练好的深度学习模型&#xff0c;并且通过Py…

Python中的四种条件语句结构和应用举例

Python中的四种条件语句结构和应用举例 条件语句是计算机实现分类高效执行计算的重要方法。在许多计算机语言编写&#xff08;C语言&#xff0c;Java语言&#xff0c;matlab语言等&#xff09;的时候&#xff0c;都有涉及条件语句的部分&#xff0c;本文对Python语言中的条件语…