作品展示
背景需求:
前文做了“”材料”图片的数一数学具,效果不错,
https://blog.csdn.net/reasonsummer/article/details/138466325https://blog.csdn.net/reasonsummer/article/details/138466325
为了让图案内容更丰富,我又选了孩子们“春游活动(学军活动计划书)”上的人物图案——军人叔叔站军姿、吊杠训练、射击训练等动作
一、素材准备
选一些特征明显人物图片,进行特写拍照
放到Photoshop里面修图,做成黑白简笔画(517*517像素)
素材位置
代码与“材料”相同,也是生成5个等级(0,5-0.1)
'''
04数一数图片(人物图片)边框内+图形不相接
作者:AI对话大师、阿夏
时间:2024年4月28日 20:00
'''
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import os
import random
import time
from shapely.geometry import Polygon
# 输入画布大小和要生成的图片数量
canvas_size =15
# int(input('请输入画布大小:15\n'))
num =int(input('请输入要生成的图片数量:100次\n'))# 提取的数量,尽量多一点刷100可能也只有8个图案
f=int(input('几份:2\n'))
# 创建目录
output_dir = r'C:\Users\jg2yXRZ\OneDrive\桌面\数一数2\04自制框内不连接'
os.makedirs(output_dir, exist_ok=True)
# 统计每张图片出现的次数
image_count = {}
z='人物'
pic_dir = fr'C:\Users\jg2yXRZ\OneDrive\桌面\数一数2\00幼儿图片\{z}'
# 创建目录
end=output_dir+fr'\{pic_dir[-2:]}'
os.makedirs(end, exist_ok=True)
# 获取文件夹中的所有文件
file_list = os.listdir(pic_dir)
# 过滤出图片文件
image_files = [file for file in file_list if file.endswith('.png') or file.endswith('.jpg') or file.endswith('.jpeg')]
# 构建图片文件的完整路径
# # 自制图片路径
animal_paths = [os.path.join(pic_dir, file) for file in image_files]
print(len(animal_paths))
# 0.1缩放比例的范围,从0.1-0.6,01-01生成图案最多,0,1-0,5因为有大图占满了,所以小图数量会很少
fw=[]
# 倒过来的数字,数字越大图案大,数量少,难度越低
for y in range(5,0,-1):
fw.append(f'0.{y}')
print(fw)
# 提取的数量,尽量多一点刷100可能也只有8个图案
nn=1
# 几份?
for ff in fw: # 0.1-0.1
print(f'0.1-{ff}')
for ii in range(f): # 生成2份
print(f'第{ii+1}份')
# 图形尺寸范围
size_range = (0.1, float(ff)) # 图片尺寸范围(相对于画布大小的比例)
# 创建画布
fig, ax = plt.subplots(figsize=(canvas_size, canvas_size))
ax.set_xlim([0, canvas_size])
ax.set_ylim([0, canvas_size])
shapes = [] # 存储已生成的图形
# 随机生成指定数量的动物图片
# for ii in range(num):r
tencent_dir = output_dir+r'\零时'
os.makedirs(tencent_dir, exist_ok=True)
# 统计每张图片出现的次数
image_count = {}
for i in range(num): # 随机抽取6张
# 随机选择动物图片
animal_path = random.choice(animal_paths)
img = mpimg.imread(animal_path)
img_height, img_width = img.shape[:2]
# 随机确定图片的大小和位置
size = random.uniform(size_range[0], size_range[1]) * canvas_size
position_x = random.uniform(0, canvas_size - size)
position_y = random.uniform(0, canvas_size - size)
# 检查图片是否与其他图片不相交
shape = Polygon([(position_x, position_y),
(position_x + size, position_y),
(position_x + size, position_y + size),
(position_x, position_y + size)])
if not any(shape.intersects(s) for s in shapes):
# 添加图片到画布
ax.imshow(img, extent=[position_x, position_x + size, position_y, position_y + size])
shapes.append(shape)
# 统计图片出现的次数
if animal_path in image_count:
image_count[animal_path] += 1
else:
image_count[animal_path] = 1
# 隐藏坐标轴
ax.axis('off')
# 打印每张图片出现的次数
print("图片统计:")
for image_path, count in image_count.items():
print(f"{image_path}: {count}")
# 保存图形
output_path = os.path.join(tencent_dir, f'{ii:02d}.png')
plt.savefig(output_path, dpi=200, bbox_inches='tight')
# import time
# time.sleep(2)
shapes.clear()
# 暂停3秒
time.sleep(1)
import os
import shutil
# 获取123文件夹中的所有文件
files = os.listdir(tencent_dir)
# 遍历文件夹中的文件
source_file_path = ""
target_file_path = ""
for file in files:
# 构建源文件路径和目标文件路径
source_file_path = os.path.join(tencent_dir, file)
file=f'{nn:02d}.png'
target_file_path = os.path.join(end, file)
nn+=1
# 剪切文件到目标文件夹
shutil.move(source_file_path, target_file_path)
# 清空画布和图形列表
ax.cla()
shapes.clear()
# 关闭画布
plt.close(fig)
# # 删除文件夹
import shutil
shutil.rmtree(tencent_dir)