截图工具作用
依次显示一个文件夹中所有的jpg和png文件,通过鼠标选择位置,从每张图中截图得到固定宽度和固定高度的小图,并将小图重命名保存在原图的相同目录。每张大图可以截取多次,可以撤销之前的选择框,使用方法如下:
使用步骤
- 修改CutTool.py (后文)中第六行path变量,修改为包含所有未切分的原图的文件夹
- 修改第八行和第九行的width和height为切出来的相片的长和宽
- 运行CutTool.py
- 程序展示图片,使用鼠标在图片上左键单击选中Box的左上角
- 鼠标单击后按键盘i,显示Box
- 如果Box满意可以按回车键自动切分并保存Box内的内容到path文件中(文件名为原文件名+boxed),如果Box不满意可以按u删除本次选择操作
- 按空格键可以结束该图片,进入下一个图片的编辑
总结
空格-结束这张图进入下一张
左键-确定一个截图的起点
i-展示这张图最近确定的框选
u-清除目前图的所有框选
enter-确定这张图的最近一次框选,截图并保存
【注:一张图可以截取不限数量的小图,截取之后的图片保存在和原图相同的路径并且在文件名结尾处加上了boxed标记和序号】
源码
# coding: utf-8
import cv2
import os
import copy
# The folder that contain all the pictures
path = '你的文件地址'
# box size
width = 50
height = 100
#inner param
global gx
global gy
gx = 0
gy = 0
def clickListner(event,x,y,flags,param):
global gx
global gy
if event == 1:
print('clicked',x,',',y)
gx,gy = x,y
#get all the files
allFiles = os.listdir(path)
allValid = []
for file in allFiles:
if file[-4:]=='.jpg' or file[-4:]=='.png':
allValid.append(file)
# i:105 space:32 enter:13 u:117
for file in allValid:
file = os.path.join(path,file)
img = cv2.imread(file,cv2.IMREAD_GRAYSCALE)
imgcopy = copy.deepcopy(img)
cnt = 0
while(True):
cv2.namedWindow('current')
cv2.imshow('current',imgcopy)
cv2.setMouseCallback("current",clickListner)
key = cv2.waitKey(0)
print(key)
if(key==13): # enter
outputimg = img[gy:gy+width,gx:gx+width]
cv2.imwrite(file[:-4]+'_boxed'+str(cnt)+'.jpg',outputimg)
cnt += 1
outputimg = None
gx,gy = 0,0
imgcopy = copy.deepcopy(img)
if(key == 105): # draw box
cv2.rectangle(imgcopy,(gx,gy),(gx+width,gy+width),255,2)
if(key == 32): # skip
break
if(key == 117): #undo
gx,gy = 0,0
imgcopy = copy.deepcopy(img)
cv2.destroyAllWindows()