社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python送你一个圣诞帽和5棵圣诞树

Crossin的编程教室 • 6 月前 • 120 次点击  

马上又到圣诞节啦,先提前祝大家圣诞快乐!🎄🎄🎄

有人要说了,圣诞节是耶稣诞生的日子,我又不信基督教,有啥好庆祝的。这你就有所不知了,Python 的诞生也跟圣诞节有关:1989 年,那是一个冬天,那年的第一场雪来得比以往时候来得更早一些,有一位程序员,在圣诞期间的阿姆斯特丹感觉特别闲,就决定开发一个新的脚本语言。他一边开发一边刷剧,于是新语言的命名也来自于他热衷的豆瓣9分神剧《Monty Python’s Flying Circus(巨蟒剧团之飞翔的马戏团)》。

此人便是后来的 Python 之父·仁慈的独裁者·Guido van Rossum

不少朋友这个时候喜欢换上一张有圣诞氛围的头像。有不少工具都能轻松实现。

如果你恰好又在学习编程,不妨试试用Python自己实现一个类似的效果。



一种实现方式就是借助 OpenCV 库检测出照片中的人脸位置,再把圣诞帽的图片叠加上去,三四十行代码就能搞定。调试的时候要注意点,图像坐标和像素矩阵索引的维度别搞乱了。

大致步骤:
  1. 安装 OpenCV(可通过pip安装)

  2. 用 OpenCV 提供的级联分类器做人脸检测,定位出图片中的人脸位置

  3. 根据找出的人脸,调整圣诞帽的位置和大小,叠加到原图片上

  4. 遍历所有人脸,重复执行步骤3,过程中可随机变换帽子的样式

  5. 保存图片

OpenCV 人脸检测代码:

# -*- coding: utf8 -*-import cv2import random
# OpenCV 人脸检测face_patterns = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')sample_image = cv2.imread('img/face2.jpg')  # 照片路径faces = face_patterns.detectMultiScale(sample_image, scaleFactor=1.1, minNeighbors=8, minSize=(50, 50))# 圣诞帽hats = []for i in range(4):    hats.append(cv2.imread('img/hat%d.png' % i, -1))  # 帽子图片路径
for face in faces: # 随机一顶帽子 hat = random.choice(hats) # 调整帽子尺寸 scale = face[3] / hat.shape[0] * 1.25 hat = cv2.resize(hat, (0, 0), fx=scale, fy=scale) # 根据人脸坐标调整帽子位置 x_offset = int(face[0] + face[2] / 2 - hat.shape[1] / 2) y_offset = int(face[1] - hat.shape[0] / 2) # 计算贴图位置,注意防止超出边界的情况 x1, x2 = max(x_offset, 0), min(x_offset + hat.shape[1], sample_image.shape[1]) y1, y2 = max(y_offset, 0), min(y_offset + hat.shape[0], sample_image.shape[0]) hat_x1 = max(0, -x_offset) hat_x2 = hat_x1 + x2 - x1 hat_y1 = max(0, -y_offset) hat_y2 = hat_y1 + y2 - y1 # 透明部分的处理 alpha_h = hat[hat_y1:hat_y2, hat_x1:hat_x2, 3] / 255 alpha = 1 - alpha_h # 按3个通道合并图片 for c in range(0, 3): sample_image[y1:y2, x1:x2, c] = (alpha_h * hat[hat_y1:hat_y2, hat_x1:hat_x2, c] + alpha * sample_image[y1:y2, x1:x2, c])
# 保存最终结果cv2.imwrite('faces_detect.png', sample_image)

除了圣诞帽,再给大家送上几棵圣诞树吧。

1、极简版

这个可算是最简单的圣诞树了。类似我们习题中的打印三角形,三四行代码即可搞定(刚开始学编程的同学可以不看代码自己尝试写下):

height = 11
for i in range(height):
   print((' ' * (height - i)) + ('*' * ((2 * i) + 1)))
print((' ' * height) + '|')

2、彩色版

在极简版的基础上,可以通过特殊转义字符实现变色,给圣诞树加上点缀。要注意的是,字符颜色并不是对所有 IDE 环境都有效,不同系统也不一样(Windows 仅部分命令行有效):

import random
height = 11
for i in range(height):
   print(' ' * (height - i), end='')
   for j in range((2 * i) + 1):
       if random.random() < 0.1:
           color = random.choice(['\033[1;31m', '\033[33m', '\033[1;34m'])
           print(color, end='')  # 彩灯
       else:
           print('\033[32m', end='')  # 绿色
       print('*', end='')
   print()
print((' ' * height) + '|')

3、海龟版

Python 里有个自带的绘图工具叫 turtle,编程教室之前介绍过《【编程课堂】海龟作图》,用它也能画圣诞树。完整代码见文末地址,核心绘制代码:

# 创建画板
import turtle
screen = turtle.Screen()
screen.setup(800,600)
# 画红色圆
circle = turtle.Turtle()
circle.shape('circle')
circle.color('red')
circle.up()
circle.goto(0,100)
circle.stamp()
# 画绿色方块
square = turtle.Turtle()
square.shape('square')
square.color('green')
square.up()
square.goto(0,200)
square.stamp()
# 暂停,点击后退出
turtle.exitonclick()

4、海龟分形版

分形(Fractal):一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状。例如上面这棵圣诞树,每一个树枝又是一个小的圣诞树。这与编程中的递归思想很像:

n = 50
from turtle import *
speed("fastest")
left(90)
forward(3*n)
# 顶部五角星略过
color("dark green")
backward(n*4.8)
def tree(d, s):
   if d <= 0:
       return
   forward(s)
   tree(d-1, s*.8)
   right(120)
   tree(d-3, s*.5)
   right(120)
   tree(d-3, s*.5)
   right(120)
   backward(s)
tree(15, n)
backward(n/2)
exitonclick()

5、炫彩版

一般圣诞树上都会挂上 blingbling 的小彩灯。通过 cls/clear 命令清屏控制台,循环多次绘制,就可以实现类似 GIF 图片的动态效果。清屏部分代码:

import platform
import os
os_name = platform.uname()[0]
IS_WIN = os_name == 'Windows'
os.system('cls' if IS_WIN else 'clear')

以上圣诞帽和圣诞树的完整代码均已上传,获取代码请加微信 crossin123 索取

【注】
海龟版、海龟分形版 来源:
R&Python绘制圣诞树-EasyCharts
https://ask.hellobi.com/blog/EasyCharts/5777
炫彩版 来源:
(圣诞礼物)在终端下画个圣诞树陪你过节-Medici.Yan
http://blog.evalbug.com/2015/12/25/py_fun_0/



Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】
购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
Crossin的其他书籍:


添加微信 crossin123 ,加入编程教室共同学习 ~

感谢转发点赞的各位~

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/177303
 
120 次点击