python 视频转字符视频 bate

这篇具有很好参考价值的文章主要介绍了python 视频转字符视频 bate。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python 视频转字符视频 bate
python 视频转字符视频 bate
只需要在最后一行括号填入视频路径即可文章来源地址https://www.toymoban.com/news/detail-508608.html

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')



到了这里,关于python 视频转字符视频 bate的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flex布局最后一行列表左对齐的方法

    使用flex布局两端对齐,但是最后一行元素居中会很丑,所以可以让最后一行元素左对齐,方法如下: 改之前: html:  css: 只需要添加几行代码:其中的数字取决于你的列表每行有几个元素,以我的为例(宽度是百分比),每行有五个元素,最后剩下的一行可能是4个、3个、2个。

    2024年02月11日
    浏览(39)
  • vi vim 末尾编辑按GA 在最后一行下方新增一行编辑按Go

    在一般模式(刚进入的模式,esc模式) GA 或 Shift + ga 先 G 或 shift+g 到最后一行 然后 A 或 shift+a 到本行末尾 并且进入文本录入模式 在一般模式(刚进入的模式,esc模式) Go 或 Shift+g 然后 o 先 G 或 shift+g 到最后一行 然后 小写 o 在该行下方新增一行 一般模式,刚进入vi的模式, esc模式,我

    2024年02月06日
    浏览(43)
  • 从 Python 中的字符串中删除最后一个分号或者逗号

    第一种方法 使用 str.rstrip() 方法从字符串中删除最后一个逗号,例如 new_str = my_str.rstrip(\\\';\\\')。 str.rstrip() 方法将返回删除尾随逗号的字符串副本 str = \\\'颜色:高帮下单备注;尺寸:42;\\\' new_str = str.rstrip(\\\';\\\') 运行结果: 第二种方法 str.rstrip 方法将包含字符的字符串作为参数,并返回删

    2024年02月02日
    浏览(42)
  • element-ui 表格吸底固定最后一行

    element-ui中表格只有固定表头以及列的方法,找遍了文档也没有固定行的方法。 于是自己些了样式。 首先需要用到css中的属性position: sticky;参考我另一篇关于css实现吸顶吸底的文章。 设置表格高度后,给需要吸底的行设置定位,我这里固定的是合计行,设置了class。 需要注

    2024年02月12日
    浏览(43)
  • C++:ifstream通过getline读取文件会忽略最后一行空行

    getline是读取文件的常用函数,虽然使用简单,但是有一个较容易被忽视的问题,就是文件最后一行空行会被忽略。  假设文件abc.txt内容为 123 456 789 最后没有空行 运行程序输出: 1{123} 2{456} 3{789}  可以看到读到了3行完整的内容  假设文件abc.txt内容为 123 456 789 最后有一行空行

    2024年01月21日
    浏览(43)
  • 【华为OD机考 统一考试机试C卷】字符串序列判定/最后一个有效字符( C++ Java JavaScript python C语言)

    2023年11月份,华为官方已经将 华为OD机考:OD统一考试(A卷 / B卷)切换到 OD统一考试(C卷)和 OD统一考试(D卷) 。 真题目录:华为OD机考机试 真题目录(C卷 + D卷 + B卷 + A卷) + 考点说明 专栏:2023华为OD机试( B卷+C卷+D卷)(C++JavaJSPy) 华为OD面试真题精选:华为OD面试真题精

    2024年02月05日
    浏览(56)
  • 给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

    给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。 输入格式: 输入第一行给出正整数n(1n≤10);随后n行,每行给出n个整数,其间以空格分隔。 输出格式: 在一行中给出该矩阵除副

    2024年02月05日
    浏览(61)
  • you-get:一行命令下载视频和Python简单使用you-get

    安装you-get库如下所示 一般的you-get 下载命令如下所示 例如:you-get https://www.bilibili.com/video/BV13V41117xc?spm_id_from=333.337.search-card.all.click 效果如下: 下载命令:-l使用如下所示。 例如 效果如下所示。 运行的代码如下所示。 可以看到视频的下载信息。 视频具有下载信息的格式。

    2024年01月17日
    浏览(41)
  • 解决flex布局中justify-content设置成space-between后因数据问题导致最后一行布局错乱

    在常用的flex布局中,当页面展示商品时,因为数据的不确定,导致justify-content设置成space-between,最后一行布局错乱   解决办法就是在小盒子后面添加标签 i 或者span标签,然后不设置高度,宽度和小盒子.box 下的div宽度一样就可以 问题来了设置几个呢,答案是设置该行的n-

    2023年04月16日
    浏览(40)
  • 【AI视频教程】只需5步,AI作出鸡你太美视频

    黄昏见证虔诚的信徒 制作视频效果,需要准备下面3个条件: 准备stable diffusion的环境 剪辑一段【鸡你太美】原版视频 stable diffusion安装sd-webui-IS-NET-pro插件 2.1部署stable diffusion环境 部署步骤参考制作ikun图片的文章:【奶奶看了都会】2分钟学会制作最近特火的ikun幻术图 这里还

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包