某音爆火的刘畊宏健身操字符动画效果python-opencv实现

博客分享了一位女程序员如何使用Python的OpenCV库将流行的刘畊宏女孩舞蹈转化为字符动画。通过灰度处理、K-means聚类和字符绘制,实现了独特的ASCII艺术效果,并获得了刘畊宏本人的认可。代码实现中涉及图像处理、字符绘制和视频读取等技术。
摘要由CSDN通过智能技术生成

编程无聊刷某音,看到一个有意思的,一个女程序员把爆火的刘畊宏女孩做成了字符动画效果,如图所示:

感觉挺酷炫,而且获得刘畊宏本人点赞

那么,我来复原一下吧

import cv2 as cv
import numpy as np
import random


def character_painting(frame, K=5):
    if type(frame) != np.ndarray:
        frame = np.array(frame)
    h, w, *_ = frame.shape
    frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    frame_array = np.float32(frame_gray.reshape(-1))
    criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)
    flags = cv.KMEANS_RANDOM_CENTERS
    compactness, labels, centroids = cv.kmeans(frame_array, K, None, criteria, 10, flags)
    centroids = np.uint8(centroids)
    centroids = centroids.flatten()
    centroids_sorted = sorted(centroids)
    centroids_index = np.array([centroids_sorted.index(value) for value in centroids])
    bright = [abs((3 * i - 2 * K) / (3 * K)) for i in range(1, 1 + K)]
    bright_bound = bright.index(np.min(bright))
    shadow = [abs((3 * i - K) / (3 * K)) for i in range(1, 1 + K)]
    shadow_bound = shadow.index(np.min(shadow))
    labels = labels.flatten()
    labels = centroids_index[labels]
    labels_picked = [labels[rows * w:(rows + 1) * w:2] for rows in range(0, h, 2)]
    canvas = np.zeros((3 * h, 3 * w, 3), np.uint8)
    canvas.fill(255)
    y = 8
    for rows in labels_picked:
        x = 0
        for cols in rows:
            if cols <= shadow_bound:
                cv.putText(canvas, str(random.randint(2, 9)),
                            (x, y), cv.FONT_HERSHEY_PLAIN, 0.45, 1)
            elif cols <= bright_bound:
                cv.putText(canvas, str("-"), (x, y),
                            cv.FONT_HERSHEY_PLAIN, 0.4, 0, 1)
            x += 6
        y += 6
    return canvas

if __name__ == '__main__':
    video = cv.VideoCapture('D:/dance.mp4')
    if video.isOpened():
        open, frame = video.read()
    else:
        open = False

    while open:
        ret, frame = video.read()
        if frame is None:
            break
        if ret == True:
            img = cv.resize(frame, (300, 300))
            str_img = character_painting(img)
            cv.imshow('result', str_img)

            if cv.waitKey(10) & 0xff == 27:
                break

    video.release()
    cv.destroyAllWindows()

由于不能上传视频,那么看复原效果的截图吧:

运行时可以按ESC退出哦,玩一玩吧

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
战斗机音爆是指飞机飞行速度达到了音速,产生了一声巨响。飞行员在进行音爆训练时,需要达到特定的高度和速度,并且保持一定的飞行姿态。下面是一个使用Python模拟战斗机音爆的示例代码: ```python import math # 定义常数 g = 9.8 # 重力加速度 p0 = 101325 # 标准大气压 T0 = 288.15 # 标准温度 R = 287.0 # 气体常数 gamma = 1.4 # 比热比 a = math.sqrt(gamma * R * T0) # 声速 # 定义起始高度和速度 h0 = 10000.0 # 起始高度 v0 = 300.0 # 初始速度 # 初始化变量 t = 0.0 # 时间 h = h0 # 高度 v = v0 # 速度 p = p0 * (1 - 0.0065 * h / T0) ** 5.2561 # 当前气压 # 模拟飞行过程 while v >= a: rho = p / (R * T0 * (1 - 0.0065 * h / T0) ** 4.2561) # 计算当前空气密度 q = 0.5 * rho * v ** 2 # 计算当前动压 M = v / a # 计算当前马赫数 D = q * 0.02 # 计算当前阻力 F = D - g * math.sin(math.atan(v / h)) # 计算当前合力 a = F / 1000 # 计算当前加速度 v = v + a * t # 计算当前速度 h = h - v * t + 0.5 * a * t ** 2 # 计算当前高度 p = p0 * (1 - 0.0065 * h / T0) ** 5.2561 # 计算当前气压 t += 0.01 # 更新时间 print('达到音速的高度为:%.2f m' % h) ``` 在上述代码中,我们使用了一些基本的物理公式来模拟战斗机音爆的过程。具体来说,我们根据当前高度和速度计算出当前的空气密度、动压、马赫数、阻力、合力和加速度,并使用欧拉积分法来更新速度和高度。当飞机速度达到声速时,程序输出达到音速的高度。需要注意的是,这里的模拟是基于一些简化假设的,实际情况可能会更加复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值