python 视频转字符视频 bate

news2024/11/20 9:48:23

在这里插入图片描述
在这里插入图片描述
只需要在最后一行括号填入视频路径即可

import os
from PIL import Image, ImageDraw, ImageFont
import cv2
import time
from tqdm import tqdm
import threading    
if __name__ == '__main__':
 
    # path = r'img\sportball\0.jpg'
    def cv2_pit_imgchar(path,save_path=''):
        
        def create_img(text,show='no',save_path=save_path):#创建图片,将文本写入到图片
            s = time.time()
            img = Image.new('RGB', (1260, 915), color = (255, 255, 255))#创建一张图片
            draw = ImageDraw.Draw(img)
            font = ImageFont.truetype('SIMLI.TTF', 10)#字体,文字大小
            draw.text((1,0),text, font=font, fill=(0, 0, 0))#起始坐标,字符串,字体,字体颜色
            e = time.time()
            # print(f'创建图片写入字符耗时{round(e-s,2)}s')
            if show=='yes':#如果show为yes,
                img.show()
            if not save_path=='':#如果路径不为空,保存图片
                img.save(save_path)
            return img


        ASCII_CHARS = ['.',',',':',';','+','*','?','T','P','%','@']
        # ascii_chars = "MNHQ$OC67+>!:-. "
        # ASCII_CHARS=list(ascii_chars)
        ASCII_CHARS = ASCII_CHARS[::-1]#反转
        
        img1 = cv2.imread(path,cv2.IMREAD_GRAYSCALE)#读取图片并转为灰度图 
        def cv2_img_resize(img1,w_size):#缩放图片
            h,w = img1.shape[0:2]#获取图片高宽
            # print(f"图片原始高度{h}宽度{w}")
            re_rate=h/w#缩放比例
            # print(f'比例{re_rate}')
            img1=cv2.resize(img1,(w_size,int(w_size*re_rate/2)))#缩放图片,因为字符宽高不一致需要压缩一半图片高度
            return img1
        img1 = cv2_img_resize(img1,250)
        def img_to_char(img1):#将图片按灰度值转为字符
            img_text = ''
            s1 = time.time()
            for y in img1:
                for x in y:
                    new_pixels = [ASCII_CHARS[x//25]]
                    new_pixels= ''.join(new_pixels)
                    img_text+=str(new_pixels)
                    # print(x,end=',')
                img_text+='\n'
            e1 = time.time()
            # print(f'读取全图灰度值耗时{round(e1-s1,2)}s')
            return img_text
        img_text = img_to_char(img1)
        create_img(img_text)#创建图片
        
    # cv2_pit_imgchar(path)
    
    def get_folder_imgs(folder):#读取获得文件夹下所有jpg文件路径,返回图片路径列表
        x=0
        path_list = []
        for img_name in os.listdir(folder):
            if '.jpg' in img_name:
                # print(img_name)
                path_list.append(folder+img_name)
                x+=1
        print(f'总共{x}张图片')
        return path_list
    def video_to_imgs(video_path = r"D:\1111\sportballcn.mp4",save_path='img/sportball/',th=4):#将视频拆成图片
        
        video = cv2.VideoCapture(video_path)
        fps = int(video.get(cv2.CAP_PROP_FPS))  # 获取视频每秒的帧数
        if not os.path.exists(save_path):
            print('创建保存路径')
            os.makedirs(save_path)
        
        def run(t,th):
            video = cv2.VideoCapture(video_path)
            frames = video.get(cv2.CAP_PROP_FRAME_COUNT)#获取视频总帧数
            print(f'第{t+1}个线程启动,处理{int(frames*t/th)}{int(frames*(t+1)/th)}帧')
            t1 = time.time()
            for x in tqdm(range(int(frames))):
                retval,image = video.read()
                if not retval:
                    break
                if frames*t/th<=x<=frames*(t+1)/th:
                    cv2.imwrite(f'{save_path}{x}.jpg',image)
            t2 = time.time()         
            print(f"线程{t+1},耗时{round(t2-t1,2)}s")
        tt = dict()
        for t in range(th):
            tt[t]=threading.Thread(target=run,args=(t,th))
        for t in range(th):
            tt[t].start()
        for t in range(th):
            tt[t].join()

        #print('\n\n\n\n\n\n\naaaaaaaaaaaa')
        return fps    

    def batch_img_to_charimg(folder='img/sportball/',save_path='img/spaortchar/',th=1):#批量将图片转为字符图
        path_list = get_folder_imgs(folder)
        if not os.path.exists(save_path):
            print(f'创建字符图保存路径{save_path}')
            os.makedirs(save_path)
        print('正在将图片转换为字符图')
        img_counting = len(path_list)
        def run(t,th):
            t1=time.time()
            print(f'第{t+1}个线程启动,处理{int(img_counting*t/th)}{int(img_counting*(t+1)/th)}张图')
            x=0
            for path in tqdm(path_list):
                name = path.split('/')[-1]
                if img_counting*t/th<=x<=img_counting*(t+1)/th:
                    cv2_pit_imgchar(path=path,save_path=f'{save_path}{name}')
                x+=1
            t2 = time.time()
            print(f"线程{t+1},耗时{round(t2-t1,2)}s")
        tt=dict()            
        for t in range(th):
            tt[t]=threading.Thread(target=run,args=(t,th))
        for t in range(th):
            tt[t].start()
        for t in range(th):
            tt[t].join()

    def char_imgs_to_video(char_img_folder = "img/spaortchar",save_name='streetchar.mp4',fps=30): #将所有字符图合成视频 #包含所有字符图的路径      
        
        fps=fps #  每秒帧数,最好跟原视频一致
        size = (1260, 915)     # (宽, 高) 必须跟图片一致
        fourcc = cv2.VideoWriter_fourcc(*'mp4v')     # 编码为 mp4v 格式
        char_video = cv2.VideoWriter(save_name, fourcc, fps, size, isColor=True)
        img_names =  os.listdir(char_img_folder)
        img_names.sort(key=lambda x:int(x[:-4]))#进行排序
        print('将字符图合并成视频中...')
        for img_name in tqdm(img_names):
                
                if '.jpg' in img_name:
                    # print(char_img_folder+'/'+img_name)
                    img = cv2.imread(char_img_folder+'/'+img_name)
                    char_video.write(img)#将图片添加视频

        char_video.release()
        print('完成')

    def batch_img_to_charimg1(folder='img/aq/',save_path='img/aqchar/'):#批量将图片转为字符图
        path_list = get_folder_imgs(folder)
        if not os.path.exists(save_path):
            print(f'创建字符图保存路径{save_path}')
            os.makedirs(save_path)
        print('正在将图片转换为字符图')
        for path in tqdm(path_list):
            name = path.split('/')[-1]
            cv2_pit_imgchar(path=path,save_path=f'{save_path}{name}')
    

    def v2cv(video_path = r"D:\1111\aq.mp4"):#video_path需要转换的视频路径        
        s_p1 = 'img/img/'#图片保存路径
        s_p2 = 'img/charimg/'#字符图保存路径
        fps=30
        # 第一步,将视频拆成图片
        fps=video_to_imgs(video_path=video_path,save_path=s_p1,th=4)
        # 第二部,将图片批量转换成字符图
        batch_img_to_charimg(folder=s_p1,save_path=s_p2,th=1)#多线程很慢是啥情况 
        # 第三步,将字符图合成视频
        char_imgs_to_video(char_img_folder = s_p2,save_name='char.mp4',fps=fps)

    v2cv('d:/1111/sd.mp4')



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

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

相关文章

Flutter系列(十)实现个人中心页

基础工程&#xff1a; Flutter系列&#xff08;四&#xff09;底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 一、前言 本文用flutter实现个人中心页布局&#xff0c;效果如下图&#xff1a; 二、使用的组件 1.颜色渐变&#xff1a;LinearGradient 线性渐变组…

ChatGLM-6B第二代模型开源,拿下LLM模型中文能力评估榜单第一名

ChatGLM-6B 自3月14日发布以来&#xff0c;深受广大开发者喜爱。截至 6 月24日&#xff0c;来自 Huggingface 上的下载量已经超过 300w。 为了更进一步促进大模型开源社区的发展&#xff0c;我们再次升级 ChatGLM-6B&#xff0c;发布 ChatGLM2-6B 。在主要评估LLM模型中文能力…

【SWAT水文模型】ArcSWAT各种报错总结

1 Error Number :-2147467259&#xff1b; 对 COM 组件的调用返回了错误 HRESULT E_FAIL 1.1 报错内容 Error Number :-2147467259 Eror Message: Eror HRESULTE FAIL has been retuned froma alltoa a COM component. Module:mAnalysis Function:dissolve Procedurure:1 随后…

DDR5这么快,为啥还能那么稳?

高速先生成员--姜杰 大家都在关注DDR5跑的有多快&#xff0c;高速先生却在关心它为什么能够跑的稳…… 内存的稳定性&#xff0c;离不开RAS功能。提起RAS&#xff0c;熟悉DDR的小伙伴们一定记得行地址选通信号&#xff08;Row Address Strobe, RAS&#xff09;&#xff0c;不…

Vuforia专题:设置AR摄像头自动对焦

Vuforia专题&#xff1a;设置AR摄像头自动对焦 一&#xff0c;前言 在之前使用的时候&#xff0c;如果没有设置自动对焦可以发现&#xff0c;摄像头画面极其模糊。并导致识别的结果不是很理想 加上自动对焦后的效果如下&#xff1a; 二、具体步骤 1、ARCamera添加脚本Cam…

Axure教程——自动获取时间

本文介绍用Axure制作的自动获取时间 效果预览 预览地址&#xff1a;https://y0pdhk.axshare.com 原型制作 1、需要的元件 六个矩形 一个动态面板 2、制作 年月日 拖入一个矩形元件&#xff0c;命名为“年月日”&#xff0c;文本设置为“年月日”&#xff0c;如图&#xff1a…

基于FFMPEG的视频拉流并传给OPENCV显示

基于FFMPEG的视频拉流并传给OPENCV显示 依赖文件解压代码编写依赖配置编译运行 依赖文件解压 将ffmpeg-master-latest-win64-gpl-shared解压&#xff0c;得到如下所示文件夹&#xff1a; 将其中的bin目录下的.dll文件复制到C:\Windows\System32目录下。 代码编写 基于FFMPE…

vscode 的终端不识别npm 命令

1.问题描述 在vscode终端输入npm指令无法识别 但是在cmd就可以 在PowerShell输入npm同样无法识别 2.解决办法 点击火狐浏览器可以看到有一个路径 没有火狐浏览器点击vscode同样可以看到路径 注&#xff1a;箭头指向的就是 然后在我的电脑找到该路径 下的npm文件 删除该…

SaaS架构方案

四大架构体系&#xff08;业务架构&#xff08;省略&#xff09;、系统架构、技术架构、布署架构&#xff09; 1.业务架构&#xff08;省略&#xff09; 2.系统架构 3.技术架构图 4.布署架构

Kubernetes核心概念汇总—Kubernetes 架构

一、概述 此页面是 Kubernetes 的概述。 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。 Kub…

杂记 | Linux服务器使用docker安装keycloak(docker-compose)

文章目录 01 关于keycloak02 准备工作2.1 安装docker2.2 安装docekr-compose2.3 获取https证书 03 编写docker-compose.yml04 访问keycloak 01 关于keycloak Keycloak是一个开源的身份和访问管理解决方案&#xff0c;由RedHat公司开发和维护。它提供了一套全面的工具和功能&am…

centos 安装 nginx

1.下载nginx安装包 wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 下载到了当前目录下 2.解压安装包 解压后的结果 3.安装依赖 yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 4. ./configure --prefix/usr/lo…

雷达侦察系统

文章目录 前言 一、系统组成 二、数字信道化侦察接收机 三、信号处理器 总结 前言 本人主要从事电子侦察中辐射源目标定位的研究工作&#xff0c;下面简单介绍传统雷达侦察系统的简单系统组成&#xff0c;希望有研究相同方向的同行可以私信交流。 一、系统组成 典型雷达侦察…

python机器学习—— 数据预处理 算法初步

目录 数据预处理1.获取数据2.处理缺失值3.划分数据集4.数据预处理和PCA降维5.算法实现&#xff1a;估计器 数据预处理 1.获取数据 from sklearn.datasets import load_iris liload_iris() print("获取特征值") print(li.data) print("目标值",li.target)#…

千万级规模微服务稳定性技术揭秘:隔离策略

随着当今云原生的发展&#xff0c;无状态微服务系统通过其良好的设计理念和相关技术栈的成熟&#xff0c;成为越来越多企业建设系统的首选&#xff0c;但不可避免的是随着微服务拆分系统增多&#xff0c;稳定性慢慢会被重视&#xff0c;如何保证服务7*24小时不间断服务&#xf…

数据结构---循环链表

数据结构—循环链表 循环单链表 typedef struct LNode {ElemType data;struct LNode* next; }LNode, *LinkList;循环单链表初始化 bool InitList(LinkList &L) {L (LNode*)malloc(sizeof(LNode));if (L NULL) return false;L->next L; //头结点next指向头结点retur…

Postman:mock server简单使用,自定义获取response body

一.mock server的作用 创建一个虚假的服务器接口&#xff0c;只要访问就可以返回设定好的response. 可用于接口调试和接口自动化测试。 二.操作步骤 首先创建一个mock server 指定response body 创建成功后Collections那里会自动多一个跟mock server 对应的接口 接下来…

前端Vue自定义银行卡号格式化组件 中间卡号文本转星号

前端Vue自定义银行卡号格式化组件 中间卡号文本转星号, 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13230 效果图如下: # cc-format-card #### 使用方法 使用方法 <!-- cardNo:银行卡号 isStar: 是否转星号 --> <cc…

基于Debian 12 “Bookworm “的SparkyLinux 7.0 “Orion Belt” 正式发布

导读SparkyLinux 开发人员今天宣布&#xff0c;SparkyLinux 7.0 “Orion Belt “已经发布并全面上市&#xff0c;这是这个基于Debian的GNU/Linux发行版的最新稳定更新。 基于最近发布的Debian 12 “Bookworm “操作系统系列&#xff0c;并与2023年7月15日的资料库同步&#xff…

bug汇集-三

1、 2、async...await 同步执行 方法一&#xff08;推荐&#xff09;&#xff1a;使用 async...await 同步执行 方法二: 不用async...await&#xff0c;就是异步处理&#xff0c;需要每一步 都加提示