Ошибка в imread после просмотра изображения в глобальной переменной file_name - PullRequest
0 голосов
/ 25 апреля 2019

Я создал простой пользовательский интерфейс с tkinter, который позволит пользователю просматривать изображение, и при нажатии кнопки «Рассчитать угол» он должен напечатать угол между двумя линиями в выбранном изображении и напечатать значение угла на консоль Python, но я получаю эти ошибки:

File "D:\Python\PyFolder\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "D:/PyCharm/PyCharm Community Edition 2018.3.5/PyProjetcs/angelTest/tkTest.py", line 21, in calculate
    image = imread(file_name)
  File "D:\PyCharm\PyCharm Community Edition 2018.3.5\PyProjetcs\angelTest\venv\lib\site-packages\matplotlib\pyplot.py", line 2152, in imread
    return matplotlib.image.imread(fname, format)
  File "D:\PyCharm\PyCharm Community Edition 2018.3.5\PyProjetcs\angelTest\venv\lib\site-packages\matplotlib\image.py", line 1369, in imread
    return handler(fname)
OSError: failed to read file

Вот мой код Python:

from tkinter import *
import tkinter.messagebox
from tkinter import filedialog
import numpy as np
from skimage.transform import (hough_line, hough_line_peaks)
from pylab import imread


root = Tk()
root.geometry('270x250')
root.title("Angle Calculation")
root.iconbitmap(r'D:\\Pictures\\iconTest.ico')


def browse_file():
    global file_name
    file_name = filedialog.askopenfile()


def calculate():
    image = imread(file_name)
    image = np.mean(image, axis=2)

    h, theta, d = hough_line(image)

    angle = []
    dist = []

    for _, a, d in zip(*hough_line_peaks(h, theta, d)):
        angle.append(a)
        dist.append(d)

    angle = [a * 180 / np.pi for a in angle]
    angle_reel = np.max(angle) - np.min(angle)

    print(angle_reel)


btn1 = Button(root, command=browse_file, text='Browse Image').pack()

btn2 = Button(root, command=calculate, text='Calculate angle').pack()

label1 = Label(root, text='The angle is equal to:').pack()
text = Entry().pack()


root.mainloop()

Может кто-нибудь, пожалуйста, объясните мне, где я испортился и как это исправить, пожалуйста, и спасибо.

1 Ответ

1 голос
/ 25 апреля 2019

Ваша проблема может быть askopenfile, которая дает объекту файла создание с open(selected_file).
Вам нужно file_name.name, чтобы получить его имя (в виде строки).

Или используйте askopenfilename для получения имени вместо файлового объекта.

...