【python&遍历图片进行分类转存到不同的文件夹】
功能说明
当不同类型的图片存放在同一个文件夹中,方便进行分类,用一个脚本,遍历读取文件夹下的所有图片,并创建一个窗口进行展示,然后输入不同的数字类别进行分类,相同种类的图片转存到自动创建的类别文件夹中。
效果展示:(分类前)
分类后:
代码实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/05/26
# @Author : Kenn_Wu
# purpose : to pick up different pictures to transfer into different dirs when you input different classify numbers
import cv2
import os
class_name = ['car', 'people', 'bicycle']
# 1 2 3
origin_path = './' # 要分类的图片文件夹路径
to_path = './ground_truth/' # 最终要保存的文件路径,判断不存在则自动创建
if not os.path.exists(to_path):
os.mkdir(to_path)
def shearfile(src, dir): # 定义一个移动(剪切)图片的函数
filename = os.path.basename(src) # 遍历得到文件/图片的初始文件名
save_path = to_path + dir # 保存文件/图片的文件夹,判断不存在则创建
if not os.path.exists(save_path):
os.mkdir(save_path)
os.rename(src, save_path + '/' + '_' +filename) # 使用rename函数,更改移动后的文件名(在原文件名的基础上增加了类别名)
for root, dirs, files in os.walk(origin_path): # 同时遍origin_path当前路径下的所有文件夹,子文件
for file in files:
key = 0
name = ""
img = cv2.imread(origin_path + file) # 遍历得到图片子文件
cv2.imshow('image',img) # 创建一个窗口展示遍历图片
key = cv2.waitKey(0)
cv2.destroyAllWindows()
if key == 49:
name = class_name[0]
elif key == 50:
name = class_name[1]
elif key == 51:
name = class_name[2]
else:
print('请输入:1 or 2 or 3 to classify')
break
shearfile(origin_path+file, name)
知识点补充
涉及知识:
① key对应的ASCⅡ码数值 (常用)
key: 48-57 对应 键盘上数字 0-9
vbKeyEscape 27 表示 ESC 键
A 键到 Z 键与其 ASCII 码的相应值’A’ 到 ‘Z’ 是一致的(‘A’ 到 ‘Z’ ---->65-90)
② python BIF:
if not os.path.exists(to_path):
os.mkdir(to_path)
③ 遍历文件夹path下的所有文件使用:for root, dirs, files in walk(path)函数。
for root, dirs, files in os.walk(origin_path):
origin_path | 代表需要遍历的根文件夹 |
---|---|
root | 表示正在遍历的文件夹的名字(根/子) |
dirs | 正在遍历的文件夹下的子文件夹集合 |
files | 正在遍历的文件夹中的文件集合 |
④ rename函数,内参数为:(原名称,更改后的名称)
os.rename(name, new_name)
⑤ waitKey(delay)函数
waitKey(delay)函数的功能是不断刷新图像,频率时间为delay,单位为ms
返回值为当前键盘按键值。
waitKey(delay)–是在一个给定的时间内(单位ms)等待用户按键触发;
如果用户没有按下键,则接续等待(循环)设置waitKey(0),则表示程序会无限制的等待用户的按键事件。
一般在imgshow的时候,如果设置waitKey(0),代表按任意键继续
显示视频时,延迟时间需要设置为 大于0的参数,用于设置在显示完一帧图像后程序等待”delay”ms再显示下一帧视频;如果使用waitKey(0)则只会显示第一帧视频
Reference:
https://blog.csdn.net/u014737138/article/details/80375514
https://blog.csdn.net/cncco/article/details/1540202