2017-02-09 10 views
1

Я новичок в программировании и пытаюсь создать изображение. Я хотел сделать возможность писать пользовательский префикс пользователем раньше в именах файлов. Размеры также настраиваются.cv2.resize() error: сохраняет одно и то же изображение с разными именами

cv2.imshow() работает нормально, но cv2.resize() этого не делает. Если я проверяю его с помощью imshow, он отображает только одно изображение, несмотря на цикл for, а затем cv2.imwrite сохраняет только одно изображение с именами всех выбранных изображений. Списки, похоже, в порядке.

Я надеюсь, что я ясно, код:

def openfiles(): 

    global picture_original 
    global file_path 
    global f 

    # Valid filetypes 
    file_types=[("Jpeg files","*.jpg"),("PNG files","*.png"),("BMP files","*.bmp"),("all files","*.*")] 

    window.filenames = filedialog.askopenfilenames(initialdir = "/",title = "Select file",filetypes = (file_types)) # TUPLE of filepath/filenames 

    #f = [] 

    # Creating a list from the tuple 
    for pics in window.filenames: 
     f.append(pics) 

     f = [picture.replace('/', "\\") for picture in f] 

    try: 
     for picture in f: 
      picture_original = cv2.imread(picture, 1) 
      #cv2.imshow("Preview", picture_original) 
      #cv2.waitKey(1) 
    except: 
     msgbox_openerror() # Error opening the file 

    # Getting the filepath only from the list "f": 
    file_path = f[0].rsplit("\\",1)[0] 
    view_list() 

def save_command(): 
    """ 
    function to save the resized pictures 
    """ 
    global picture_resized 
    global prefix 
    prefix = "Resized_" 
    lst_filename = [] 
    lst_renamed = [] 

    for i in f: 
     #print(f) 
     path,filename = os.path.split(i) # path - only filepath | filename - only filename with extension 
     lst_filename.append(prefix+filename) 

    for i in range(len(f)): 
     lst_renamed.append(os.path.join(path, lst_filename[i])) 

    for i in range(len(f)): 
     picture_resized = cv2.resize(picture_original, ((int(width.get())), int(height.get()))) 
     cv2.imshow("Preview", picture_resized) 
     cv2.waitKey(1) 

    for i in lst_renamed: 
     cv2.imwrite(i, picture_resized) 

Я надеюсь, что кто-то есть какая-то идея. Заранее спасибо!

+0

Что вы ожидаете 'picture_original' содержать после' openfiles() 'закончен? –

+0

Или 'picture_resized' ... в цикле нет ничего, что изменит размер, который будет зависеть от значения' i', поэтому вы в основном повторяете одно и то же на одних и тех же входах снова и снова. Аналогично, в цикле с 'imwrite' единственное, что изменяется, это имя файла. | Если у вас более одного имени файла для обработки (и как такового их хранить в списке), вы также должны иметь более одного изображения (и хранить их в списке). –

+1

Я ожидаю, что «picture_original» и «picture_resized» должны быть списком массивов numpy. Их тип должен быть Да, вы можете быть правым, связанным с циклами. Я пытаюсь изменить размер с помощью' picture_original [i] 'и аналогично' imwrite '. – koger23

ответ

0

Это пример, чтобы изменить размер отношение и экономит ваше изображение

def ResizeImage(filepath, newfileName,ratio): 
     image = cv2.imread(filepath)   #Open image 
     height, width = image.shape[:2]  #Shapes 
     image2 = cv2.resize(image, (width/ratio, height/ratio), interpolation = cv2.INTER_AREA) 
     cv2.imwrite(newfileName,image2)   #saves, True if OK 
     return filepath 

Так что, если вы звоните

image = "originalpath" 
resized = ResizeImage(image,"Resized_"+image,2) 
newImage = cv2.imread(resized) 
cv2.imshow("new",newImage) 
cv2.waitKey(1) 

Вы должны получить ваше изображение изменяется наполовину

+0

Ваш ответ частично корректен, но пока не служит примером для других, если они пытаются запустить ваш код «как есть». Пожалуйста, прочитайте вопрос OP снова спрашивает в сочетании с комментариями a nd измените свой ответ, соответственно, до полного рабочего ответа. Только тогда вы получите мой голос. Конец обзора. – ZF007

 Смежные вопросы

  • Нет связанных вопросов^_^