2016-07-27 52 views
1

我想使用PIL或opencv2在我的文件夾中裁剪多個圖像。但是,我在文本文件中具有與圖像文件名相同的尺寸。 所以,假設我的文件名是1_a.jpg,尺寸(左上角,左上角,左上角,上方左側,高度)在1_a.txt文件中。 因此,我的程序必須迭代每個文件,選擇尺寸並裁剪圖像。 我正在使用類似的設置,我試圖在列表中追加所有維度,然後嘗試在裁剪時迭代指向列表的圖像,但是它不起作用。 請幫忙。使用從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

我想你是假設兩個水珠調用將返回以相同的順序* .txt和* .png文件,但這是不一定是真的。有兩件事情可能會有所幫助:(1)遍歷* .TXT期間,存放在以f詞典數據[-4](文件名減去「.txt文件」)爲重點,例如,d [F [ -4]] =小。然後在* .png循環期間,通過訪問d [f [-4]]來檢索數據。 (2)跳過的* .txt文件的循環,只是讀.txt文件,而你是循環在* .png文件。你可能喜歡的東西'f_text =開做到這一點(F [-4] + 'TXT')' –

+0

謝謝!這有幫助! – Praveen

回答

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 
+0

謝謝馬丁。有效。 – Praveen