AttributeError: у объекта «PhotoImage» нет атрибута «_PhotoImage__photo» - PullRequest
0 голосов
/ 03 июня 2018

Я работаю над Yolo3-4-PY, чтобы реализовать его с помощью tkinter.

Я искал везде, но не смог решить проблему.

Когда я запускаю программу,холст отображается, но когда я нажимаю Начать видео ( btton ), я получаю следующую ошибку:

Загрузка весов из весов / yolov3.weights ... Готово!/usr/local/lib/python3.5/dist-packages/PIL/ImageTk.py:119: FutureWarning: поэлементное сравнение не удалось;вместо этого возвращает скаляр, но в будущем будет выполнять поэлементное сравнение, если режим не в ["1", "L", "RGB", "RGBA"]:

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.5/tkinter/__init__.py", line 1553, in __call__
return self.func(*args)
File "webcam_demo.py", line 13, in start_video
show_frame()
File "webcam_demo.py", line 39, in show_frame
imgtk = ImageTk.PhotoImage(image=cv2image)
File "/usr/local/lib/python3.5/dist-packages/PIL/ImageTk.py", line 120, in 
__init__
mode = Image.getmodebase(mode)
File "/usr/local/lib/python3.5/dist-packages/PIL/Image.py", line 313, in 
getmodebase
return ImageMode.getmode(mode).basemode
File "/usr/local/lib/python3.5/dist-packages/PIL/ImageMode.py", line 55, in 
getmode
return _modes[mode]
TypeError: unhashable type: 'numpy.ndarray'
Exception ignored in: <bound method PhotoImage.__del__ of 
<PIL.ImageTk.PhotoImage object at 0x7f4b73f455c0>>
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/PIL/ImageTk.py", line 130, in 
__del__    name = self.__photo.name
AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'

1 Ответ

0 голосов
/ 04 июня 2018

Issue

В строке imgtk = ImageTk.PhotoImage(image=cv2image) вы передаете пустой массив (cv2image) в качестве входных данных для ImageTk.PhotoImage.Но в исходном коде PIL.ImageTk упоминается, что для этого требуется изображение PIL.

Это то, что упоминает исходный код PIL.ImageTk для init () PhotoImage.

class PhotoImage(object):
    .....
    :param image: Either a PIL image, or a mode string.  If a mode string is
              used, a size must also be given.

Решение

Таким образом, вам нужно будет преобразовать массив numpy в изображение PIL, а затем передать его ImageTk.PhotoImage ().

Итак, вы можете заменить строку imgtk = ImageTk.PhotoImage(image=cv2image) на imgtk = ImageTk.PhotoImage(image=PIL.Image.fromarray(cv2image))?

Это преобразует массив numpy в изображение PIL и будет передан в метод.

Ссылки

Я извлек код для преобразования numpyмассив в PIL Изображение из этого источника .

...