我想使用PIL或opencv2在我的文件夹中裁剪多个图像。但是,我在文本文件中的尺寸与图像具有相同的文件名。 所以,假设我的文件名是1_a.jpg,尺寸(左上角x,宽度;左上角x,高度)位于1_a.txt文件中。 因此,我的程序必须遍历每个文件,选择尺寸并裁剪图像。 我正在使用类似的设置,我试图将所有维度分别附加到列表中,然后尝试在裁剪时迭代指向列表的图像,但是,它不起作用。 请帮助。
在下面找到我的代码: -
for f in glob.glob(os.path.join(faces_folder_path, "*.txt")):
file = open(f)
small=[]
data= file.read()
print type(data)
small.append(data.rstrip('\n'))
print small
print small[1]
print type(small)
x.append(small)
print type(x)
print x
# print type(list)
# print list
# # print x
# x.append(list)
# for i,val in enumerate(x):
# print val[0]
for f in glob.glob(os.path.join(faces_folder_path, "*.png")):
imgfile = f[53:75]
print imgfile
img=cv2.imread(imgfile)
cv2.imshow('image',img)
print (x[i])
print type(x[i])
# new_image=img[x[i]]
# cv2.imshow('cropped',new_image)
# cv2.imsave('imgfile',new_image)
i+=1
cv2.waitKey(0)
答案 0 :(得分:1)
您最好循环浏览所有PNG文件,并且每次尝试查找匹配的文本文件,如下所示:
import glob
import os
import re
faces_folder_path = r"c:\myfiles"
for png_file in glob.glob(os.path.join(faces_folder_path, "*.png")):
name, ext = os.path.splitext(os.path.basename(png_file))
try:
with open(os.path.join(faces_folder_path, '{}.txt'.format(name))) as f_text:
re_crop = re.search(r'(\d+),(\d+);(\d+),(\d+)', f_text.read())
if re_crop:
x, width, y, height = [int(v) for v in re_crop.groups()]
# Add crop code here
else:
print '"{}" text file format not understood'.format(png_file)
except IOError as e:
print '"{}" has no matching txt file'.format(png_file)
这将获取每个png文件的文件路径并提取基本文件名。然后它构造一个匹配的txt文件,加载它并使用正则表达式尝试找到所需的裁剪细节。每个条目都转换为int
。
这假设示例文本文件看起来像这样:
0,100;10,50