2016-07-27 63 views
1

我寫了這段python代碼,它從圖像存儲庫下載許多圖像並將它們保存在指定的文件夾中。代碼如下所示:自動下載圖像

import urllib.request 
import cv2 
import numpy as np 
import os 

def store_raw_images(): 
    neg_images_link = 'http://image- net.org/api/text/imagenet.synset.geturls?wnid=n00464651' 
    neg_images_urls = urllib.request.urlopen(neg_images_link).read().decode() 

    if not os.path.exists('neg'): 
     os.makedirs('neg') 

    pic_num = 1 
    for i in neg_images_urls.split('\n'): 
     try: 
      print(i) 
      urllib.request.urlretrieve(i, "neg/{}.jpg".format(pic_num)) 
      img = cv2.imread("neg/{}.jpg".format(pic_num) + cv2.IMREAD_GRAYSCALE) 
      resized_image = cv2.resize(img, (100, 100)) 
      cv2.imwrite("neg/{}.jpg".format(pic_num), resized_image) 
      pic_num = pic_num + 1 
      print(pic_num) 

     except Exception as e: 
      print(str(e)) 

store_raw_images() 

由於某些原因圖像被替換,我沒有看到所有圖像。我不斷看到一個圖像1.jpg,並且所有圖像似乎都被替換了,不過我希望圖像的名稱可以去1.jpg2.jpg,...。

我也看到這個警告/錯誤,但我不確定它是否與這個問題有關。

Can't convert 'int' object to str 
http://www.azjeugd.nl/site/modules/xcgal/albums/20082009seizoen/a1/groningen_thuis/IMG_7798.jpg 
    HTTP Error 403: Forbidden 
    http://www.ga-eagles.nl/images/duels1e0809/gaetel6.jpg 

你認爲問題出在哪裏?

注意,我增加了圖像編號:

 pic_num = pic_num + 1 
+0

這是什麼'+'在這裏'cv2.imread(「neg/{}。jpg」.format(pic_num)+ cv2.IMREAD_GRAYSCALE)''。我不認爲那應該在那裏。 –

+0

爲什麼不改變這樣的文件名? '「pic」+ str(pic_num)+「。jpg」' –

+0

我相信問題只是'+'符號。爲什麼你認爲''neg/{}。jpg「.format(pic_num)'和'」neg /「+ str(pic_num)+」.jpg「'是不同的?謝謝拉弗檢測出來! –

回答

1

你有一個try/except塊的一切。假設cv2.imwrite失敗,但所有其他行都沒有任何問題執行,您的代碼將永遠不會達到picnum = picnum + 1。 嘗試重新安排您的代碼,首先增加picnum並檢查哪些行實際上會給您提供錯誤。

+1

對於OP:如果使用['enumerate'](https://docs.python.org/3/library/functions.html? highlight = enumerate#enumerate):'爲pic_num,我在枚舉(neg_images_urls.split('\ n'),1):'。 –

+0

好意思謝謝 –

+0

還有一些建議,除了@Rawing的好主意。您可以使用''neg/{}。jpg「.format(pic_num)'三次,使用一個變量,如果您想稍後改變它,可以減少工作。split('\ n')'可以寫成'splitlines ()'並且會爲你節省不必要的空的最後一個字段 –