编程无聊刷某音,看到一个有意思的,一个女程序员把爆火的刘畊宏女孩做成了字符动画效果,如图所示:
感觉挺酷炫,而且获得刘畊宏本人点赞
那么,我来复原一下吧
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退出哦,玩一玩吧