精选了20个Python实战项目(附源码),拿走就用!

article/2025/9/4 0:01:31

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

昔闻洞庭水,今上岳阳楼。

大家好,我是小F。

Python是目前最好的编程语言之一。由于其可读性和对初学者的友好性,已被广泛使用。

那么要想学会并掌握Python,可以实战的练习项目是必不可少的。

接下来,我将给大家介绍20个非常实用的Python项目,帮助大家更好的学习Python。

大家也可根据项目的需求,自己构建解决方法,提高编程水平。

 猜字游戏

在这个游戏中,你必须一个字母一个字母的猜出秘密单词。

如果你猜错了一个字母,你将丢掉一条命。

正如游戏名那样,你需要仔细选择字母,因为你的生命数量非常有限。

import random# 生命次数
lives = 3# 神秘单词, 随机选择
words = ['pizza', 'fairy', 'teeth', 'shirt', 'otter', 'plane']
secret_word = random.choice(words)
# print(secret_word)clue = list('?????')
heart_symbol = u'\u2764'guessed_word_correctly = Falsedef update_clue(guessed_letter, secret_word, clue):index = 0while index < len(secret_word):if guessed_letter == secret_word[index]:clue[index] = guessed_letterindex = index + 1while lives > 0:print(clue)print('剩余生命次数: ' + heart_symbol * lives)guess = input('猜测字母或者是整个单词: ')if guess == secret_word:guessed_word_correctly = Truebreakif guess in secret_word:update_clue(guess, secret_word, clue)else:print('错误。你丢了一条命\n')lives = lives - 1if guessed_word_correctly:print('你赢了! 秘密单词是 ' + secret_word)
else:print('你输了! 秘密单词是 ' + secret_word)

下面就让小F,来玩一下。

b87f3c22414a74625303d5488363d239.png

 闹钟

闹钟是一种具有可以在预先设定的时间被激活以响铃的功能的时钟,用于唤醒打工人们。

使用Python中的DateTime模块来创建闹钟,并用Python中的playsound库来播放闹钟声音。

from datetime import datetime
from playsound import playsound# 输入
alarm_time = input("请输入闹钟时间, 示例: 09:50:00 am\n")
# 时
alarm_hour = alarm_time[0:2]
# 分
alarm_minute = alarm_time[3:5]
# 秒
alarm_seconds = alarm_time[6:8]
# 上午或下午
alarm_period = alarm_time[9:11].upper()
print("完成闹钟设置..")while True:now = datetime.now()current_hour = now.strftime("%I")current_minute = now.strftime("%M")current_seconds = now.strftime("%S")current_period = now.strftime("%p")# 时间判断if alarm_period == current_period:if alarm_hour == current_hour:if alarm_minute == current_minute:if alarm_seconds == current_seconds:print("起来啦!")# 闹钟铃声playsound('audio.mp3')break

来测试一下,设置一个闹钟,到指定时间就会有音乐响起。

66fa1a505a67c2caa69cb261b3c00c99.png

 骰子模拟器

可以通过选择1到6之间的随机整数,来完成骰子模拟。

import random# 设置最大值和最小值
min_val = 1
max_val = 6# 是否继续
roll_again = "yes"# 循环
while roll_again == "yes" or roll_again == "y":print("开始掷骰子")print("骰子数值是 :")# 第一轮print(random.randint(min_val, max_val))# 第二轮print(random.randint(min_val, max_val))# 是否继续roll_again = input("是否继续掷骰子?(是的话, 输入yes或者y)")

使用random.randint()函数。函数根据我们指定的开始和结束范围返回一个随机整数。

ea4de7941a9f7ec4839e6cebcaa40260.png

 二维码

二维码是用于将数据编码和解码为机器可读的方法。

包含一个白色背景上的黑色方块网格,可以被任何成像设备(如手机)读取,并进行处理以从图案中提取所需的数据。

import pyqrcode# 设置二维码信息
s = "https://www.baidu.com"# 生成二维码
url = pyqrcode.create(s)# 保存二维码
url.svg("baidu.svg", scale=8)

结果如下。

d0555f34df2cdc6c74e450cca330c08f.png

 语言检测

当你需要处理包含不同语言数据,且数据非常大的时候,语言检测就派上用场了。

使用Python中的langdetect包,可以在几行代码内检测超过55种不同的语言。

from langdetect import detecttext = input("输入信息: ")
print(detect(text))

示例。

38faff794236a0209c59ce6eff79b61d.png

 加密和解密

密码术意味着更改消息的文本,以便不知道你秘密的人永远不会理解你的消息。

下面就来创建一个GUI应用程序,使用Python进行加密和解密。

在这里,我们需要编写使用无限循环的代码,代码将不断询问用户是否要加密或解密消息。

from tkinter import messagebox, simpledialog, Tkdef is_even(number):return number % 2 == 0def get_even_letters(message):even_letters = []for counter in range(0, len(message)):if is_even(counter):even_letters.append(message[counter])return even_lettersdef get_odd_letters(message):odd_letters = []for counter in range(0, len(message)):if not is_even(counter):odd_letters.append(message[counter])return odd_lettersdef swap_letters(message):letter_list = []if not is_even(len(message)):message = message + 'x'even_letters = get_even_letters(message)odd_letters = get_odd_letters(message)for counter in range(0, int(len(message) / 2)):letter_list.append(odd_letters[counter])letter_list.append(even_letters[counter])new_message = ''.join(letter_list)return new_messagedef get_task():task = simpledialog.askstring('任务', '你是否想要加密或解密信息?')return taskdef get_message():message = simpledialog.askstring('信息', '输入相关信息: ')return messageroot = Tk()
while True:task = get_task()if task == '加密':message = get_message()encrypted = swap_letters(message)messagebox.showinfo('密电的密文为:', encrypted)elif task == '解密':message = get_message()decrypted = swap_letters(message)messagebox.showinfo('密电的明文为:', decrypted)else:breakroot.mainloop()

示例。

cead061af73a630af6c0557549ed822d.png

b2b18d9cf00108b85e7eff9a077fffe5.png

2adbd1b97d7da840a366f17aa4e7fe08.png

 URL缩短

短网址由于易于记忆和输入,因此在数字营销领域非常受欢迎。

这里给大家介绍一下,如何使用Python创建URL缩短器。

from __future__ import with_statement
import contextlib
try:from urllib.parse import urlencode
except ImportError:from urllib import urlencode
try:from urllib.request import urlopen
except ImportError:from urllib2 import urlopen
import sysdef make_tiny(url):request_url = ('http://tinyurl.com/api-create.php?' + urlencode({'url': url}))# print(request_url)with contextlib.closing(urlopen(request_url)) as response:return response.read().decode('utf-8')def main():for tinyurl in map(make_tiny, ['https://baijiahao.baidu.com/s?id=1719379508156841662']):print(tinyurl)if __name__ == '__main__':main()

运行代码,输出如下。

# 输出
https://tinyurl.com/y4z6z2gq

 音乐播放器

音乐播放器,可让你快速轻松地管理和收听所有音乐文件。

应该不少小伙伴都使用过,网易云音乐、QQ音乐、酷狗音乐等。

这里小F将使用Pygame和Tkinter,来创建一个音乐播放器。

import pygame
import tkinter as tkr
from tkinter.filedialog import askdirectory
import osmusic_player = tkr.Tk()
music_player.title("我的音乐播放器")
music_player.geometry("450x350")
directory = askdirectory()
os.chdir(directory)
song_list = os.listdir()play_list = tkr.Listbox(music_player, font="Helvetica 12 bold", bg='yellow', selectmode=tkr.SINGLE)
for item in song_list:pos = 0play_list.insert(pos, item)pos += 1
pygame.init()
pygame.mixer.init()def play():"""播放"""pygame.mixer.music.load(play_list.get(tkr.ACTIVE))var.set(play_list.get(tkr.ACTIVE))pygame.mixer.music.play()def stop():"""停止"""pygame.mixer.music.stop()def pause():"""暂停"""pygame.mixer.music.pause()def unpause():"""取消暂停"""pygame.mixer.music.unpause()Button1 = tkr.Button(music_player, width=5, height=3, font="Helvetica 12 bold", text="播放", command=play, bg="blue", fg="white")
Button2 = tkr.Button(music_player, width=5, height=3, font="Helvetica 12 bold", text="停止", command=stop, bg="red", fg="white")
Button3 = tkr.Button(music_player, width=5, height=3, font="Helvetica 12 bold", text="暂停", command=pause, bg="purple", fg="white")
Button4 = tkr.Button(music_player, width=5, height=3, font="Helvetica 12 bold", text="取消暂停", command=unpause, bg="orange", fg="white")var = tkr.StringVar()
song_title = tkr.Label(music_player, font="Helvetica 12 bold", textvariable=var)song_title.pack()
Button1.pack(fill="x")
Button2.pack(fill="x")
Button3.pack(fill="x")
Button4.pack(fill="x")
play_list.pack(fill="both", expand="yes")
music_player.mainloop()

选择音乐文件所在的文件夹,点击播放,即可听见音乐。

8896744973ab189a66bdc62622ccda32.png

 生命游戏

生命游戏由英国数学家约翰·H·康威设计的,是一种类似于生物社会的兴衰和交替的游戏。

e7ac0880b53ef2fa9ccb0e3a8d37e87c.gif

游戏使用无限大小的矩形网格,其中每个网格都是空的或被有机体占据。被占用的细胞是活的,而空的细胞是死的。

游戏在特定时期内进行,每一轮都会根据当前配置中生物体的排列创建一个新的世代。

下一代网格的状态,是通过将以下四个基本规则应用于当前配置的每个网格来确定的:

  • 如果一个细胞还活着并且有两个或三个活着的邻居,那么该细胞在下一代中仍然活着;

  • 一个没有活邻居或只有一个活邻居的活细胞会在下一代死于孤立;

  • 有四个或更多活邻居的活细胞会因下一代人口过剩而死亡;

  • 一个只有三个活着的邻居的死细胞会导致出生并在下一代中存活;

board = [[1, 0, 0], [1, 0, 0], [1, 0, 0]]# 邻居数组为给定的单元格找到8个相邻的单元格
neighbors = [(1, 0), (1, -1), (0, -1), (-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1)]rows = len(board)
cols = len(board[0])# 创建一个原始板的副本
copy_board = [[board[row][col] for col in range(cols)] for row in range(rows)]# 逐个单元地迭代
for row in range(rows):for col in range(cols):# 对于每个单元计算邻居的数量live_neighbors = 0for neighbor in neighbors:r = (row + neighbor[0])c = (col + neighbor[1])# 检查相邻细胞的有效性,以及它是否原来是一个活细胞# 评估是针对副本进行的,因为它永远不会更新。if (r < rows and r >= 0) and (c < cols and c >= 0) and (copy_board[r][c] == 1):live_neighbors += 1# 规则1或规则3if copy_board[row][col] == 1 and (live_neighbors < 2 or live_neighbors > 3):board[row][col] = 0# 规则4if copy_board[row][col] == 0 and live_neighbors == 3:board[row][col] = 1print(board)

结果如下。

# 输入
board = [[1, 0, 0], [1, 0, 0], [1, 0, 0]]# 输出
board = [[0, 0, 0], [1, 1, 0], [0, 0, 0]]

 Turtle绘图

Turtle模块提供了在二维平面上移动的环境。

Turtle可以实现位置、航向和各种可能的状态和动作。

import turtle as turoo = tu.Turtle()  # 创建对象
wn = tu.Screen()  # 屏幕对象
wn.bgcolor("black")  # 屏幕背景
wn.title("分形树")
roo.left(90)  # 移动
roo.speed(20)  # 速度def draw(l):  # 以长度'l'作为参数的递归函数if l < 10:returnelse:roo.pensize(2)  # 设置画笔大小roo.pencolor("yellow")  # 画笔颜色roo.forward(l)  # 朝向roo.left(30)  # 移动draw(3 * l / 4)  # 绘制roo.right(60)  # 移动draw(3 * l / 4)  # 绘制roo.left(30)  # 移动roo.pensize(2)roo.backward(l)  # 返回初始位置draw(20)  # 绘制20次roo.right(90)
roo.speed(2000)# recursion
def draw(l):if (l < 10):returnelse:roo.pensize(2)roo.pencolor("magenta")  # magentaroo.forward(l)roo.left(30)draw(3 * l / 4)roo.right(60)draw(3 * l / 4)roo.left(30)roo.pensize(2)roo.backward(l)draw(20)roo.left(270)
roo.speed(2000)# recursion
def draw(l):if (l < 10):returnelse:roo.pensize(2)roo.pencolor("red")  # redroo.forward(l)roo.left(30)draw(3 * l / 4)roo.right(60)draw(3 * l / 4)roo.left(30)roo.pensize(2)roo.backward(l)draw(20)roo.right(90)
roo.speed(2000)# recursion
def draw(l):if (l < 10):returnelse:roo.pensize(2)roo.pencolor('#FFF8DC')  # whiteroo.forward(l)roo.left(30)draw(3 * l / 4)roo.right(60)draw(3 * l / 4)roo.left(30)roo.pensize(2)roo.backward(l)draw(20)########################################################def draw(l):if (l < 10):returnelse:roo.pensize(3)roo.pencolor("lightgreen")  # lightgreenroo.forward(l)roo.left(30)draw(4 * l / 5)roo.right(60)draw(4 * l / 5)roo.left(30)roo.pensize(3)roo.backward(l)draw(40)roo.right(90)
roo.speed(2000)# recursion
def draw(l):if (l < 10):returnelse:roo.pensize(3)roo.pencolor("red")  # redroo.forward(l)roo.left(30)draw(4 * l / 5)roo.right(60)draw(4 * l / 5)roo.left(30)roo.pensize(3)roo.backward(l)draw(40)roo.left(270)
roo.speed(2000)# recursion
def draw(l):if (l < 10):returnelse:roo.pensize(3)roo.pencolor("yellow")  # yellowroo.forward(l)roo.left(30)draw(4 * l / 5)roo.right(60)draw(4 * l / 5)roo.left(30)roo.pensize(3)roo.backward(l)draw(40)roo.right(90)
roo.speed(2000)# recursion
def draw(l):if (l < 10):returnelse:roo.pensize(3)roo.pencolor('#FFF8DC')  # whiteroo.forward(l)roo.left(30)draw(4 * l / 5)roo.right(60)draw(4 * l / 5)roo.left(30)roo.pensize(3)roo.backward(l)draw(40)########################################################
def draw(l):if (l < 10):returnelse:roo.pensize(2)roo.pencolor("cyan")  # cyanroo.forward(l)roo.left(30)draw(6 * l / 7)roo.right(60)draw(6 * l / 7)roo.left(30)roo.pensize(2)roo.backward(l)draw(60)roo.right(90)
roo.speed(2000)# recursion
def draw(l):if (l < 10):returnelse:roo.pensize(2)roo.pencolor("yellow")  # yellowroo.forward(l)roo.left(30)draw(6 * l / 7)roo.right(60)draw(6 * l / 7)roo.left(30)roo.pensize(2)roo.backward(l)draw(60)roo.left(270)
roo.speed(2000)# recursion
def draw(l):if (l < 10):returnelse:roo.pensize(2)roo.pencolor("magenta")  # magentaroo.forward(l)roo.left(30)draw(6 * l / 7)roo.right(60)draw(6 * l / 7)roo.left(30)roo.pensize(2)roo.backward(l)draw(60)roo.right(90)
roo.speed(2000)# recursion
def draw(l):if (l < 10):returnelse:roo.pensize(2)roo.pencolor('#FFF8DC')  # whiteroo.forward(l)roo.left(30)draw(6 * l / 7)roo.right(60)draw(6 * l / 7)roo.left(30)roo.pensize(2)roo.backward(l)draw(60)
wn.exitonclick()

绘制时间较长,结果如下,挺好看的。

8e01446d8f9dd5d11270607a2647f8c2.jpeg

 计算器

Kivy是一个免费的开源Python库,可以快速轻松地开发高度交互的跨平台应用程序。

这里我将使用Python中的Kivy包来构建一个计算器GUI。

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Labelclass myApp(App):def build(self):root_widget = BoxLayout(orientation='vertical')output_label = Label(size_hint_y=0.75, font_size=50)button_symbols = ('1', '2', '3', '+','4', '5', '6', '-','7', '8', '9', '.','0', '*', '/', '=')button_grid = GridLayout(cols=4, size_hint_y=2)for symbol in button_symbols:button_grid.add_widget(Button(text=symbol))clear_button = Button(text='Clear', size_hint_y=None, height=100)def print_button_text(instance):output_label.text += instance.textfor button in button_grid.children[1:]:button.bind(on_press=print_button_text)def resize_label_text(label, new_height):label.fontsize = 0.5*label.heightoutput_label.bind(height=resize_label_text)def evaluate_result(instance):try:output_label.text = str(eval(output_label.text))except SyntaxError:output_label.text = 'Python Syntax error!'button_grid.children[0].bind(on_press=evaluate_result)def clear_label(instance):output_label.text = " "clear_button.bind(on_press=clear_label)root_widget.add_widget(output_label)root_widget.add_widget(button_grid)root_widget.add_widget(clear_button)return root_widgetmyApp().run()

运行代码,出现一个计算器,非常好用!

5e200e5b75f4b52867589ea04fe9d753.png

 猜数游戏

猜数字游戏目的是猜测出程序想出的数字,基本逻辑:

  • 程序随机选择1到100之间的一个数字或任何其他数字组合;

  • 然后它会要求玩家输入它的建议;

  • 然后它会检查这个数字是否与计算机随机生成的数字相同;如果是,则玩家获胜;

  • 如果玩家的猜测不一样,那么它会检查数字是否高于或低于猜测并告诉玩家;

import random# 创建随机数
n = random.randrange(1,100)
# 获取输入
guess = int(input("输入任意数值: "))while n != guess: # 判断是否正确# 小于if guess < n:print("太小了")guess = int(input("再次输入数值: "))# 大于elif guess > n:print("太大了!")guess = int(input("再次输入数值: "))else:break
print("真棒,你猜对了!!")

运行代码,小F来猜一猜。

5c25d23cf3ca230782ee6d5618405b99.png

 图像转换器

我们知道有大量的图像文件格式可用于存储图形数据,最流行的便是JPG和PNG。

使用Python中的Tkinter库和PIL库,创建一个将PNG图像转换为JPG的应用程序。

import tkinter as tk
from tkinter import filedialog
from PIL import Imageroot = tk.Tk()
canvas1 = tk.Canvas(root, width=300, height=250, bg='azure3', relief='raised')
canvas1.pack()label1 = tk.Label(root, text="图像转换器", bg='azure3')
label1.config(font=('helvetica', 20))
canvas1.create_window(150, 60, window=label1)def getPNG():global im1import_file_path = filedialog.askopenfilename()im1 = Image.open(import_file_path)browse_png = tk.Button(text="选择PNG文件", command=getPNG, bg="royalblue", fg='white', font=('helvetica', 12, 'bold'))
canvas1.create_window(150, 130, window=browse_png)def convert():global im1export_file_path = filedialog.asksaveasfilename(defaultextension='.jpg')im1.save(export_file_path)saveasbutton = tk.Button(text="转换PNG成JPG", command=convert, bg='royalblue', fg='white', font=('helvetica', 12, 'bold'))
canvas1.create_window(150, 180, window=saveasbutton)
root.mainloop()

运行代码,选择图片,点击转换按钮,即可完成图像格式变换。

fe1af978bd4607c9796012fce59d8113.png

 重量转换器

重量换算是指单位值乘以标准换算值。

使用Python中的Tkinter库创建一个重量转换器应用程序。

from tkinter import *# 创建一个GUI窗口
window = Tk()def from_kg():gram = float(e2_value.get())*1000pound = float(e2_value.get())*2.20462ounce = float(e2_value.get())*35.274t1.delete("1.0", END)t1.insert(END, gram)t2.delete("1.0", END)t2.insert(END, pound)t3.delete("1.0", END)t3.insert(END, ounce)e1 = Label(window, text="输入重量(单位KG)")
e2_value = StringVar()
e2 = Entry(window, textvariable=e2_value)
e3 = Label(window, text="Gram")
e4 = Label(window, text="Pound")
e5 = Label(window, text="Ounce")t1 = Text(window, height=5, width=30)
t2 = Text(window, height=5, width=30)
t3 = Text(window, height=5, width=30)b1 = Button(window, text="Convert", command=from_kg)e1.grid(row=0, column=0)
e2.grid(row=0, column=1)
e3.grid(row=1, column=0)
e4.grid(row=1, column=1)
e5.grid(row=1, column=2)
t1.grid(row=2, column=0)
t2.grid(row=2, column=1)
t3.grid(row=2, column=2)
b1.grid(row=0, column=2)window.mainloop()

运行代码,出现界面,输入数值,点击转换。

c5b72275993c4370686275173bbab795.png

 年龄和性别检测

使用Python编程语言带你完成使用机器学习进行年龄和性别检测的任务。

首先需要编写用于检测人脸的代码,因为如果没有人脸检测,我们将无法进一步完成年龄和性别预测的任务。

下一步是预测图像中人的性别。在这里,我将性别网络加载到内存中,并将检测到的人脸通过网络传输,用于性别检测任务。

下一个任务是预测图像中人类的年龄。这里我将加载网络并使用前向传递来获取输出。由于网络架构与性别网络相似,我们可以充分利用所有输出来获得任务的预期年龄组来检测年龄。

import cv2 as cvdef getFaceBox(net, frame, conf_threshold=0.7):# 获取位置frameOpencvDnn = frame.copy()frameHeight = frameOpencvDnn.shape[0]frameWidth = frameOpencvDnn.shape[1]blob = cv.dnn.blobFromImage(frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False)net.setInput(blob)detections = net.forward()bboxes = []for i in range(detections.shape[2]):confidence = detections[0, 0, i, 2]if confidence > conf_threshold:x1 = int(detections[0, 0, i, 3] * frameWidth)y1 = int(detections[0, 0, i, 4] * frameHeight)x2 = int(detections[0, 0, i, 5] * frameWidth)y2 = int(detections[0, 0, i, 6] * frameHeight)bboxes.append([x1, y1, x2, y2])cv.rectangle(frameOpencvDnn, (x1, y1), (x2, y2), (0, 255, 0), int(round(frameHeight/150)), 8)return frameOpencvDnn, bboxes# 性别
genderProto = "gender_deploy.prototxt"
genderModel = "gender_net.caffemodel"
genderNet = cv.dnn.readNet(genderModel, genderProto)
# 性别参数
genderList = ['Male', 'Female']# 年龄
ageProto = "age_deploy.prototxt"
ageModel = "age_net.caffemodel"
ageNet = cv.dnn.readNet(ageModel, ageProto)
# 年龄参数
ageList = ['(0 - 2)', '(4 - 6)', '(8 - 12)', '(15 - 20)', '(25 - 32)', '(38 - 43)', '(48 - 53)', '(60 - 100)']MODEL_MEAN_VALUES = (78.4263377603, 87.7689143744, 114.895847746)
padding = 20# 人脸
faceProto = 'opencv_face_detector.pbtxt'
faceModel = 'opencv_face_detector_uint8.pb'
faceNet = cv.dnn.readNet(faceModel, faceProto)# 读取图片
frame = cv.imread('image1.jpg')
frameFace, bboxes = getFaceBox(faceNet, frame)for bbox in bboxes:face = frame[max(0, bbox[1] - padding):min(bbox[3] + padding, frame.shape[0] - 1),max(0, bbox[0] - padding):min(bbox[2] + padding, frame.shape[1] - 1)]blob = cv.dnn.blobFromImage(face, 1, (227, 227), MODEL_MEAN_VALUES, swapRB=False)genderNet.setInput(blob)genderPreds = genderNet.forward()gender = genderList[genderPreds[0].argmax()]print("Gender Output : {}".format(genderPreds))print("Gender : {}".format(gender))ageNet.setInput(blob)agePreds = ageNet.forward()age = ageList[agePreds[0].argmax()]print("Gender Output : {}".format(agePreds))print("Gender : {}".format(age))label = "{}, {}".format(gender, age)cv.namedWindow("Age Gender Demo", 0)cv.resizeWindow("Age Gender Demo", 900, 500)cv.putText(frameFace, label, (bbox[0], bbox[1] - 20), cv.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 3, cv.LINE_AA)cv.imshow("Age Gender Demo", frameFace)cv.waitKey(0)

运行代码,结果如下。

a15c7aa9b2e81bc5b91381efe741e12e.png

性别是OK的,就是年龄差了点意思。

 人脸检测

构建一个检测人脸的程序是开始机器学习计算机视觉任务的好方法。

使用Python的OpenCV库进行人脸检测的任务。

import cv2face_cascade = cv2.CascadeClassifier('face_detector.xml')
img = cv2.imread('image.jpg')
faces = face_cascade.detectMultiScale(img, 1.1, 10)for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.imwrite("face_detected.png", img)
print('Successfully saved')

原图如下。

a64cebe8dd29a0acd4aec40b2074fc51.jpeg

检测结果。

fe88187d60956a01f8babdb22e0fec4b.png

 铅笔素描

使用不到20行的Python代码将图像转换为铅笔素描。

import cv2image = cv2.imread("dog.jpg")
cv2.imshow("Dog", image)
cv2.waitKey(0)gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("New Dog", gray_image)
cv2.waitKey(0)inverted_image = 255 - gray_image
cv2.imshow("Inverted", inverted_image)
cv2.waitKey()blurred = cv2.GaussianBlur(inverted_image, (21, 21), 0)inverted_blurred = 255 - blurred
pencil_sketch = cv2.divide(gray_image, inverted_blurred, scale=256.0)
cv2.imshow("Sketch", pencil_sketch)
cv2.waitKey(0)cv2.imshow("original image", image)
cv2.imshow("pencil sketch", pencil_sketch)
cv2.waitKey(0)

结果如下。

941d5a76e7cfb3ada18c2c64f99fd051.png

 文本编辑器

使用Python创建一个文本编辑器GUI,它可以创建、打开、编辑和保存文本文件。

所有小部件的排列方式应使按钮小部件位于窗口布局的左侧,而文本框小部件位于右侧。

import tkinter as tk
from tkinter.filedialog import askopenfilename, asksaveasfilenamedef open_file():"""打开"""filepath = askopenfilename(filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")])if not filepath:returntxt_edit.delete(1.0, tk.END)with open(filepath, "r") as input_file:text = input_file.read()txt_edit.insert(tk.END, text)window.title(f"文本编辑器 - {filepath}")def save_file():"""保存"""filepath = asksaveasfilename(defaultextension="txt",filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")],)if not filepath:returnwith open(filepath, "w") as output_file:text = txt_edit.get(1.0, tk.END)output_file.write(text)window.title(f"文本编辑器 - {filepath}")window = tk.Tk()
window.title("文本编辑器")
window.rowconfigure(0, minsize=800, weight=1)
window.columnconfigure(1, minsize=800, weight=1)txt_edit = tk.Text(window)
fr_buttons = tk.Frame(window, relief=tk.RAISED, bd=2)
btn_open = tk.Button(fr_buttons, text="打开", command=open_file)
btn_save = tk.Button(fr_buttons, text="保存", command=save_file)btn_open.grid(row=0, column=0, sticky="ew", padx=5, pady=5)
btn_save.grid(row=1, column=0, sticky="ew", padx=5)fr_buttons.grid(row=0, column=0, sticky="ns")
txt_edit.grid(row=0, column=1, sticky="nsew")window.mainloop()

结果如下。

f5290313f34407dd24188296ce4b63b4.png

 图像分割

图像分割是机器视觉应用中将数字图像划分为一组像素的关键过程之一。

看看下面的图片,糖果按特定顺序排列形成一个词。

9d98fa900bd11f0f35f47186d53513f0.png

如果具有视觉的机器人是按颜色来计算糖果的数量,那么了解糖果之间的界限对它来说就很重要。

from skimage.io import imread
from skimage import color
import numpy as np
import matplotlib.pyplot as plt# 读取图片
cimage = imread('photo.jpg')
fig, ax = plt.subplots(figsize=(20, 20))
ax.imshow(cimage)
ax.axis('off')# RGB转为LAB
lab_img = color.rgb2lab(cimage)
x, y, z = lab_img.shape# 显示颜色
to_plot = cimage.reshape(x * y, 3)
colors_map = to_plot.astype(np.float) / 256# 创建数据
scatter_x = []
scatter_y = []
for xi in range(x):for yi in range(y):L_val = lab_img[xi, yi][0]A_val = lab_img[xi, yi][1]B_val = lab_img[xi, yi][2]scatter_x.append(A_val)scatter_y.append(B_val)plt.figure(figsize=(20, 20))
plt.xlabel("a* from green to red")
plt.ylabel("b* from blue to yellow")
plt.scatter(scatter_x, scatter_y, c=colors_map)
# 显示
plt.show()

我们可以使用散点图,根据糖果的颜色对图像进行分割。

8231e28850931327977fd0ae3e7dea9d.png

最后我们可以根据颜色,正确地分割图像中的糖果。

def filter_color(L_val_min, A_val_min, A_val_max, B_val_min, B_val_max):filtered_image = np.copy(cimage)for xi in range(x):for yi in range(y):L_val = lab_img[xi, yi][0]A_val = lab_img[xi, yi][1]B_val = lab_img[xi, yi][2]if L_val > L_val_min and A_val > A_val_min and A_val < A_val_max  and B_val > B_val_min and B_val < B_val_max:passelse:filtered_image[xi, yi] = [255,255,255]return filtered_imagelab_img = color.rgb2lab(cimage)
yellow = filter_color(70, -50, 0, 30, 100)
red = filter_color(30, 25, 100, 0, 100)
green = filter_color(50, -128, -20, 0, 50)
blue = filter_color(50, -40, 30, -128, -20)
white = filter_color(93, -25, 25, -25, 25)
pink = filter_color(50, 20, 128, -50, 0)fig, ax = plt.subplots(nrows=3, ncols=2, figsize=(20,20))
ax[0][0].imshow(pink)
ax[0][0].set_title("pink Candies")
ax[0][0].axis('off')ax[0][1].imshow(yellow)
ax[0][1].set_title("yellow Candies")
ax[0][1].axis('off')ax[1][0].imshow(red)
ax[1][0].set_title("red Candies")
ax[1][0].axis('off')ax[1][1].imshow(green)
ax[1][1].set_title("green Candies")
ax[1][1].axis('off')ax[2][0].imshow(white)
ax[2][0].set_title("white Candies")
ax[2][0].axis('off')ax[2][1].imshow(blue)
ax[2][1].set_title("blue Candies")
ax[2][1].axis('off')
plt.show()

结果如下。

bcb0c63dffe86aab34e5849d10262f76.png

 模拟时钟

使用Tkinter制作一个简单的模拟时钟GUI应用程序。

try:import Tkinter
except:import tkinter as Tkinterimport math
import timeclass main(Tkinter.Tk):def __init__(self):Tkinter.Tk.__init__(self)self.x = 150  # 中心点x坐标self.y = 150  # 中心点y坐标self.length = 50self.creating_all_function_trigger()# 触发器def creating_all_function_trigger(self):self.create_canvas_for_shapes()self.creating_background_()self.creating_sticks()return# 创建背景def creating_background_(self):self.image = Tkinter.PhotoImage(file='clock.gif')self.canvas.create_image(150, 150, image=self.image)return# 创建画布def create_canvas_for_shapes(self):self.canvas = Tkinter.Canvas(self, bg='black')self.canvas.pack(expand='yes', fill='both')return# 创建移动的线条def creating_sticks(self):self.sticks = []for i in range(3):store = self.canvas.create_line(self.x, self.y, self.x+self.length, self.y+self.length, width=2, fill='red')self.sticks.append(store)return# 定期刷新def update_class(self):now = time.localtime()t = time.strptime(str(now.tm_hour), "%H")hour = int(time.strftime("%I", t))*5now = (hour, now.tm_min, now.tm_sec)# 改变坐标for n, i in enumerate(now):x, y = self.canvas.coords(self.sticks[n])[0:2]cr = [x, y]cr.append(self.length*math.cos(math.radians(i*6)-math.radians(90))+self.x)cr.append(self.length*math.sin(math.radians(i*6)-math.radians(90))+self.y)self.canvas.coords(self.sticks[n], tuple(cr))returnif __name__ == '__main__':root = main()while True:root.update()root.update_idletasks()root.update_class()

结果如下。

acc22dc1c85293ad0e047dc5bbde53d9.png

好了,以上就是今天分享的内容,大家可以自行去动手练习。

这里小F用到了不少的Python库,大家直接pip安装即可,下面是示例。

# pip安装
pip install opencv-python -i https://simple.baidu.com/pypi/simple

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

adcba11fdde7b5a098a9df5d5f92baff.png

------------------- End -------------------

往期精彩文章推荐:

  • Python网络爬虫逆向之frida rpc转发案例(x物)

  • 在xpath匹配li标签的时候跳过第一个li标签,匹配剩下的li标签表达式怎么写?

  • 盘点两种使用Python网络爬虫实现东方财富网分时数据抓取方法

  • 手把手教你使用Python网络爬虫和邮件发送来定制你的每日一文

bfb8f3868a3ae922cdd27b2b2ef8c32d.png

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~


http://chatgpt.dhexx.cn/article/d29D285l.shtml

相关文章

100个精选Python实战项目案例,送给缺乏练手经验的你

随着 Python 语言的流行&#xff0c;越来越多的人加入到了 Python 的大家庭中。为什么这么多人学 Python &#xff1f;我要喊出那句话了&#xff1a;“人生苦短&#xff0c;我用 Python&#xff01;”&#xff0c;正是因为语法简单、容易学习&#xff0c;所以 Python 深受大家喜…

python:实战篇

python 实战 python 实战篇 1、python解压1. python解压zip、7z2. python 解压rar1&#xff09;windows&#xff1a;2&#xff09;linux: 2、python执行Linux系统命令的3种方法3、python代码打包成exe安装包安装打包加密【附】 4、windows下&#xff1a;py文件引用其他py文件5、…

【No.2】CAS单点登录的原理分析

上一篇说了基于Cookie的单点登录的实现&#xff1a;http://blog.csdn.net/readiay/article/details/52814001&#xff0c;虽然他实现简单&#xff0c;但是也问题颇多。例如&#xff1a;用户名密码不停传送&#xff0c;增加了被盗号的可能。另外&#xff0c;不能跨域&#xff01…

CAS单点登入登出原理

CAS 集中式认证服务(Central Authentication Service&#xff0c;CAS)&#xff0c;单点登录协议&#xff0c;允许一个用户访问多个应用程序&#xff0c;而只需要提供一次凭证。 具体实现框架有&#xff1a;OAuth2&#xff0c;Shiro等。 普通CAS1.0 登入详细流程 流程解析&a…

SSO单点登录原理剖析

转载于&#xff1a;http://www.cnblogs.com/gxbk629/p/4473569.html CAS实现SSO单点登录原理 1. CAS 简介 1.1. What is CAS &#xff1f; CAS &#xff08; Central Authentication Service &#xff09; 是 Yale 大学发起的一个企业级的、开源的项目&#xff0c;旨…

cas跨域单点登录原理

相同域名下实现单点登录太简单&#xff0c;因为A系统和B系统域名相同&#xff0c;在访问A时候登录过&#xff0c;在访问B时&#xff0c;由于域名相同&#xff0c;浏览器会带上cookies&#xff0c;cookies里有票据信息&#xff0c;访问B自然就不用再登录了。 可是如果A系统和B系…

CAS单点登录原理分析(二)

这篇文章对CAS单点登录具体实现的一些步骤就行讲述&#xff0c;至于CAS单点登录的实现原理分析&#xff0c;请参看下面这篇文章&#xff1a; CAS单点登录原理分析(一) https://blog.csdn.net/qq_41258204/article/details/84036875 CAS 包含两个部分&#xff1a; CAS Server …

CAS-5.2.6单点登录-退出原理

退出原理流程图&#xff1a; cas的退出有三种模式&#xff1a; NONE&#xff1a;不支持单点登录BACK_CHANNEL&#xff1a;隐式退出&#xff08;默认&#xff09;FRONT_CHANNEL&#xff1a;显式退出 参数说明 参考官网地址 https://apereo.github.io/cas/5.2.x/installation…

CAS实现单点登录原理与实例解析

上几篇博客介绍了使用cookie实现同域和跨域系统的单点登录&#xff0c;本文将介绍通过CAS实现单点登录实例。 CAS是由耶鲁大学研发的单点登录服务器&#xff0c;主要分为服务端和客户端两个系统模块&#xff1b;本文将通过官网提供的实例进行介绍。 一、CAS实现SSO的原理与认…

简述CAS单点登录的实现原理

CAS&#xff08;Central Authentication Service&#xff09;单点登录系统是一种常见的身份验证和授权解决方案&#xff0c;它可以让用户在一个认证中心&#xff08;CAS服务器&#xff09;上登录&#xff0c;然后使用此登录信息访问多个应用程序而无需再次登录。 先了解几个名…

CAS单点登录原理解析及相关配置

1、基于Cookie的单点登录的回顾 基于Cookie的单点登录核心原理&#xff1a; 将用户名密码加密之后存于Cookie中&#xff0c;之后访问网站时在过滤器&#xff08;filter&#xff09;中校验用户权限&#xff0c;如果没有权限则从Cookie中取出用户名密码进行登录&#xff0c;让用…

CAS 单点登录的实现原理(一)

一&#xff0c;会话和Cookie HTTP是无状态协议&#xff0c;客户端与服务端之间的每次通信都是独立的&#xff0c;而会话机制可以让服务端鉴别每次通讯过程中的客户端是否是同一个&#xff0c;从而保证业务的关联性。 Session是服务器使用一种类似于散列表的结构&#xff0c;用…

CAS单点登录原理及实现

CAS单点登录原理及实现 标签&#xff08;空格分隔&#xff09;&#xff1a; 单点登录 CAS SSO ###目录 概念介绍搭建流程原理分析 ###概念介绍 CAS介绍 Central Authentication Service&#xff08;缩写CAS&#xff09;是一种针对万维网的单点登录协议。它的目的是允许一个用…

单点登录CAS实现

单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份验证技术&#xff0c;它允许用户使用一组凭据&#xff08;如用户名和密码&#xff09;登录到多个应用程序或系统中&#xff0c;而无需在每个应用程序或系统中单独登录。这种技术可以提高用户体验&…

CAS单点登录原理及改造

CAS是由耶鲁大学开发的单点登录系统&#xff0c;其核心的知识点包括以下几个概念: 1) TGT: 票据&#xff0c;或称大令牌&#xff0c;在登录成功之后生成&#xff0c;其中包含了用户信息 2) TGC: TGT的key&#xff0c;TGT存储在session中&#xff0c;TGC以cookie形式保存在浏览器…

SSO单点登录原理详解(从入门到精通)

本文主要对SSO单点登录与CAS、OAuth2.0两种授权协议的关系和原理进行详细说明。 1. 基础概念 SSO单点登录&#xff08;Single sign-on&#xff09; 所谓单点登录就是在多个应用系统中&#xff0c;用户只需登录一次就可以访问所有相互信任的系统。 CAS 中央认证服务&#xf…

CAS单点登录的实现

这篇文章对CAS单点登录具体实现的一些步骤就行讲述&#xff0c;至于CAS单点登录的实现原理分析&#xff0c;请参看下面这篇文章&#xff1a;CAS单点登录原理分析(一) https://blog.csdn.net/qq_41258204/article/details/84036875 CAS 包含两个部分&#xff1a; CAS Server 和…

CAS单点登录原理解析

推荐阅读 1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住&#xff1a;永远不要在MySQL中使用UTF-8 4. Springboot启动原理解析 1、基于Cookie的单点登录的回顾 基于Cookie的单点登录核心原理&#xff1a; 将用户名密码加密之后存于Cookie中&#xff0c;之后访…

CAS单点登录的实现(二)

这篇文章对CAS单点登录具体实现的一些步骤就行讲述&#xff0c;至于CAS单点登录的实现原理分析&#xff0c;请参看下面这篇文章&#xff1a; CAS单点登录原理分析(一) https://blog.csdn.net/qq_41258204/article/details/84036875 CAS 包含两个部分&#xff1a; CAS Server 和…

CAS单点登录系列之原理简单介绍

文章目录 一、 SSO简介1.1 单点登录定义1.2 单点登录角色1.3 单点登录分类 二、 CAS简介2.1 CAS简单定义2.2 CAS体系结构2.3 CAS原理 三、CAS服务端部署附录 一、 SSO简介 1.1 单点登录定义 单点登录(Single sign on)&#xff0c;英文名称缩写SSO&#xff0c;SSO的意思就是在…