Python超简单实现同款爱心代码/opencv/几十行代码

Python超简单实现同款爱心代码/opencv/几十行代码

在这里插入图片描述

1、OpenCV逐帧处理视频获得坐标像素点

从网上寻找带有此同款爱心视频,原视频出处——《点燃我,温暖你》,截取出爱心一个周期的跳动,不会剪辑软件的也可以用opencv剪辑,代码参考如下:opencv截取视频代码
心跳的视频也可以从B找一些up主的片段节选。
截取视频片段后,opencv对视频进行逐帧处理,主要是消除视频中的噪声,干扰信息,只保留爱心信息的像素点信息。

不想做以上步骤截取处理视频,想直接获得像素点信息也可以留下邮箱我发给你

import numpy as np
import cv2 as cv
dict = {} # 空字典用来储存每一帧的像素点信息

# 检查视频是否成功读取
def cv_isOpen(vc):
    if vc.isOpened():
        # open是bool类型,提示视频是否打开
        # frame是当前帧的数据
        open, frame = vc.read()
        return open, frame
    else:
        open = False
        return open
        
# 将当前帧爱心信息的像素点保存为列表待用
def cv_threshold(img, lower: int, upper: int):
   lst = []
   for i in range(0, len(img)):
      for j in range(0, len(img[i])):
         if img[i][j][2] > lower & img[i][j][2] < upper:
           x = j
           y = i
           lst.append((x, y, random.randint(1,2)))
   return lst


def cv_getPixel(vc):
    open = cv_isOpen(vc)
    i = 0
    while open:
        _open, frame = vc.read()# 一帧一帧读取
        if frame is None:
        	print('读取失败')
            break
        if _open:
           # 视频帧截取成700*700,根据爱心位置设置截取位置
           area = frame[300:1000, 0:700]
           # 根据爱心相关信息像素点位置保存,像素点信息集中位置的阈值不同视频下有差异
           dict[i] = cv_threshold(area, 70, 170)
           i+=1
 
if __name__ == '__main__':
	vc = cv.VideoCapture('heart.mp4')
	cv_getPixel(vc)
	# 储存到npy文件中
	np.save('heartPixel.npy', dict)

2、用tkinter把每一帧信息复刻出来

import numpy as np
from tkinter import *

# 两个偏置值调整爱心在画布的位置
X_BIAS = 250 
Y_BIAS = 0
FRAMES_SKIP = 5 # 每次跳的帧数,越大越快,越小越丝滑,根据计算机性能设置
TOTAL_FRAMES = 50 # 我截取的一个跳动周期有50帧的信息
COLOR = '#ff7171' # 我选取这个粉红色

def draw(main: Tk, render_canvas: Canvas, render_frame=0):
    render_canvas.delete('all')
    render(render_canvas, render_frame)
    main.after(1, draw, main, render_canvas, render_frame + FRAMES_SKIP)

def render(render_canvas: Canvas, render_frame):
    for x, y, size in dict[render_frame % TOTAL_FRAMES]:
        render_canvas.create_rectangle(x+X_BIAS, y+Y_BIAS, size+x+X_BIAS, size+y+Y_BIAS, width=0, fill=COLOR)

if __name__ == '__main__':
    dict = np.load('heartPixel.npy', allow_pickle='TRUE').item()
    root = Tk()
    canvas = Canvas(root, bg='black', height=720, width=1280)
    canvas.pack()
    draw(root, canvas)
    root.mainloop()

3、补充

若生成的像素点太多,导致运行十分缓慢,可以用以下函数减少像素点信息,可以多用几次,不影响结果。

import random
import numpy as np
dict = np.load('heartPixel.npy', allow_pickle='TRUE').item()
for i in range(TOTAL_FRAMES):
    j = 0
    while j < len(dict[i]):
        del new_dict[i][j]
        j+=2
np.save('newHeartPixel.npy', dict)

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>