2016-07-27 62 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 ()'并且会为你节省不必要的空的最后一个字段 –