首页 > 其他分享 >视频转字符视频

视频转字符视频

时间:2023-07-22 15:11:06浏览次数:24  
标签:视频 img 字符 frame video im txt pixel

# -*- coding: utf-8 -*-
import os
import time

import cv2
import numpy
from PIL import Image, ImageDraw, ImageFont

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")  # 所用字符列表


# 将256灰度映射到70个字符上
def get_char(r, g, b, alpha=256):
    if alpha == 0:
        return ' '
    length = len(ascii_char)
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    unit = (256.0 + 1) / length
    return ascii_char[int(gray / unit)]


def frame2char(frame):
    im = Image.fromarray(frame)
    origin_img_width = im.width
    origin_img_height = im.height
    new_img_width = int(im.width / 6)
    new_img_height = int(im.height / 15)
    im_txt = Image.new("RGB", (origin_img_width, origin_img_height), (255, 255, 255))
    im = im.resize((new_img_width, new_img_height), Image.NEAREST)
    txt = ""
    colors = []
    for i in range(new_img_height):
        for j in range(new_img_width):
            pixel = im.getpixel((j, i))
            colors.append((pixel[0], pixel[1], pixel[2]))
            if len(pixel) == 4:
                txt += get_char(pixel[0], pixel[1], pixel[2], pixel[3])
            else:
                txt += get_char(pixel[0], pixel[1], pixel[2])
        txt += '\n'
        colors.append((255, 255, 255))
    dr = ImageDraw.Draw(im_txt)
    font = ImageFont.load_default().font
    x = y = 0
    font_w, font_h = font.getsize(txt[1])
    font_h *= 1.37
    for i in range(len(txt)):
        if txt[i] == '\n':
            x += font_h
            y = -font_w
        dr.text((y, x), txt[i], colors[i])
        y += font_w
    return im_txt


def get_image_size(video_path):
    frame_count, frame_width, frame_height = 0, 0, 0
    vc = cv2.VideoCapture(video_path)
    ret = vc.isOpened()
    while ret:
        ret, frame = vc.read()
        if ret:
            frame_count = int(vc.get(cv2.CAP_PROP_FRAME_COUNT))
            frame_height = vc.get(cv2.CAP_PROP_FRAME_HEIGHT)
            frame_width = vc.get(cv2.CAP_PROP_FRAME_WIDTH)
            break
    vc.release()
    time.sleep(1)
    return frame_count, frame_width, frame_height


def video2char_video(video_path, char_video_dir):
    frame_count, frame_width, frame_height = get_image_size(video_path)
    fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')
    video_writer = cv2.VideoWriter(f"{char_video_dir}/output.mp4", fourcc, 30.0,
                                   (int(frame_width), int(frame_height)))
    vc = cv2.VideoCapture(video_path)
    c = 0
    ret = vc.isOpened()
    while ret:
        c = c + 1
        ret, frame = vc.read()
        if ret:
            im_txt = frame2char(frame)
            img = cv2.cvtColor(numpy.array(im_txt), cv2.COLOR_RGB2BGR)
            video_writer.write(img)
            schedule = round(c / float(frame_count), 1) if frame_count != 0 else 1.0
            print(schedule)
        else:
            break
    # 视频释放
    vc.release()
    video_writer.release()


def main():
    video_path = '/home/navy/Desktop/1.mp4'
    video_dir = os.path.dirname(os.path.abspath(video_path))
    output_dir = f"{video_dir}/output"
    os.makedirs(output_dir, exist_ok=True)
    video2char_video(video_path, output_dir)


if __name__ == "__main__":
    main()

  

标签:视频,img,字符,frame,video,im,txt,pixel
From: https://www.cnblogs.com/navysummer/p/17573406.html

相关文章

  • 7.20 字符串
    传送门题单一放出来,各路神仙各显神通,\(\text{SAM}\)大神怒切的同时大喊这不都是板题?AC自动机大神大喊他不会\(\text{KMP}\)?Z函数大神大叫这是板题?而我,发现字符串算法是我忘得最干净的一块,只记得无脑\(\text{Hash}\)。一怒之下,重学了\(\text{SAM}\)。CF432DPrefixesandSu......
  • js 计算两个字符串日期相差多少天
    你可以使用JavaScript的Date对象来计算两个字符串日期之间的天数差异。首先,将两个字符串转换为Date对象,然后计算它们之间的毫秒差值,最后将毫秒差值转换为天数。以下是一个示例代码:functiongetDaysDifference(dateString1,dateString2){vardate1=newDate(dateString1......
  • 字典dict转字符串
    在Python中,可以使用不同的方法将字典转换为字符串。以下是几种常用的方法:使用str()函数:emy_dict={'key1':'value1','key2':'value2','key3':'value3'}dict_str=str(my_dict)print(dict_str)#输出:{'key1':'value......
  • Java数字转换为字符
    Java数字转换为字符在Java编程中,我们经常需要将数字转换为字符。这种转换可以在很多场景中使用,比如将数字转换为字符以便于打印、将数字转换为字符以便于进行字符操作等等。本文将介绍在Java中如何进行数字到字符的转换,并提供一些代码示例来帮助读者更好地理解。使用Character类......
  • HJ65 查找两个字符串a,b中的最长公共子串
    1.题目读题 HJ65 查找两个字符串a,b中的最长公共子串 考查点 2.解法思路 代码逻辑 具体实现自行实现 publicclassHJ065{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println(dp(sc.n......
  • java base64编码字符串
    JavaBase64编码字符串Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式。在Java中,我们可以使用Java提供的Base64类来进行Base64编码和解码操作。Base64编码和解码Base64编码将二进制数据转换为一组可打印的ASCII字符。这种编码方式通常用于在网络传输中传递二进制......
  • java ascii码转字符
    JavaASCII码转字符ASCII(AmericanStandardCodeforInformationInterchange)是一种能够将英文字母、数字和特殊字符等转换成计算机可识别的数字编码的标准。在Java中,可以使用ASCII码将数字转换为对应的字符,或者将字符转换为对应的ASCII码值。本文将介绍如何在Java中使用ASCII码......
  • HJ59 找出字符串中第一个只出现一次的字符
    1.题目读题HJ59 找出字符串中第一个只出现一次的字符  考查点 2.解法思路 代码逻辑 具体实现 自行实现 publicclassHJ059{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println(ge......
  • 流媒体视频融合平台EasyCVR更新版本后,首页无法打开的原因排查与解决
    EasyCVR视频融合平台基于云边端一体化架构,可支持多协议、多类型设备接入,包括:NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力,可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理。有用户反馈......
  • struts2标签判断字符串
    11:<s:propertyvalue='#attr.jxwReadyOnly'/>22:<s:propertyvalue='#attr.jxwReadyOnly=="jxwReadyOnly"'/>33:<s:propertyvalue='#session.get("jxwReadyOnly")=="jxwReadyOnly"'/>44:......