Найти - Пользователи
Полная версия: TypeError: Image data of dtype object cannot be converted to float
Начало » Python для новичков » TypeError: Image data of dtype object cannot be converted to float
1
Vseslav
Доброго времени суток.Возникла необходимость нахождения наиболее подобных изображений в двух разных папках и формирования пар оригинал/подобие. Использую Python 3.7 и OpenCV
Изображения в обеих папках имеют одинаковый стандарт (jpeg с одинаковым разрешением)
Был написан код (не ругайте строго за стиль, я только начинаю постигать python)

 frames_path = "E:/My_prog/frames/"
analysis_path = "E:/My_prog/analysis/"
for frame_file in os.listdir(frames_path): #перебираем файлы фреймов
    difference = 2
    proper_image = ""
    
    frame = cv2.imread(frame_file, 0) #читаем фрейм
    frame_hist = cv2.calcHist([frame], [0], None, [256], [0, 256])   #строим гистограмму
    for thumb_file in os.listdir(analysis_path): #перебираем файлы для анализа
        thumb = cv2.imread(thumb_file, 0) #читаем файл для анализа
        
        img = Image.open("%s%s"%(analysis_path, thumb_file))
        img.show()
        thumb_hist = cv2.calcHist([thumb], [0], None, [256], [0, 256])
        
        plt.imshow(thumb)
        plt.show()
        img_hist_diff = cv2.compareHist(frame_hist, thumb_hist, cv2.HISTCMP_BHATTACHARYYA)
        img_template_probability_match = cv2.matchTemplate(frame_hist, thumb_hist, cv2.TM_CCOEFF_NORMED)[0][0]
        img_template_diff = 1 - img_template_probability_match
        commutative_image_diff = img_hist_diff + (img_template_diff/10)
        
        if difference>commutative_image_diff:
            difference = commutative_image_diff
            proper_image = thumb_file
        print (frame_file)
        print (proper_image)
        print (difference)

Следующие строки были добавлены исключительно для собственного понимания почему код без них всегда даёт нулевую гистограмму thumb_file и будет стёрт после исправления ошибки
         plt.imshow(thumb)
        plt.show()

При попытке исполнения кода получаю
—————————————————————————
TypeError Traceback (most recent call last)
<ipython-input-159-367fb0418268> in <module>
18 thumb_hist = cv2.calcHist(, , None, , )
19 # print (thumb_file)
—> 20 plt.imshow(thumb)
21 plt.show()
22 # print (thumb_hist)
………………………………….
TypeError: Image data of dtype object cannot be converted to float

Поиски в сети натолкнули на мысль, что ошибка возникает так как не выполняется строчка
  thumb = cv2.imread(thumb_file, 0)
Т.е. изображение не может быть прочитано

Вместе с тем, часть кода
         img = Image.open("%s%s"%(analysis_path, thumb_file))
        img.show()
исполняется и изображение открывается (т.е. файл существует)

Хочу также заметить, что
     frame = cv2.imread(frame_file, 0) #читаем фрейм
    frame_hist = cv2.calcHist([frame], [0], None, [256], [0, 256])   #строим гистограмму
срабатывает отлично и, при желании, эти изображения легко открываются внутри цикла через plt.imshow

Подскажите пожалуйста, в чём может быть причина такой ошибки и как её исправить

Заранее благодарен
py.user.next
Vseslav
Т.е. изображение не может быть прочитано
Через обычный print() выводи на экран все пути к файлам, которые открываешь. Так ты будешь знать, что именно ты открываешь, и так ты увидишь, что где-то путь неполный.
os.listdir() не выполняет никаких соединений путей. Если ты получил имя файла через os.listdir(), то потом тебе нужно склеивать путь к директории и имя файла воедино.
Vseslav
py.user.next
Через обычный print() выводи на экран все пути к файлам, которые открываешь. Так ты будешь знать, что именно ты открываешь, и так ты увидишь, что где-то путь неполный.
os.listdir() не выполняет никаких соединений путей. Если ты получил имя файла через os.listdir(), то потом тебе нужно склеивать путь к директории и имя файла воедино.
Переписал так:
    for thumb_file in os.listdir(analysis_path): #перебираем файлы для анализа
        thumb_file_full = "%s%s"%(analysis_path, thumb_file)
        print (thumb_file_full)
        thumb = cv2.imread(thumb_file_full, 0) #читаем файл для анализа
        thumb_hist = cv2.calcHist([thumb], [0], None, [256], [0, 256])
        plt.imshow(thumb)
        plt.show()

Результат абсолютно аналогичный предыдущему
print (thumb_file_full) выводит правильный путь к файлу
py.user.next
Скидывай полный код, который запускаешь, не надо бросать кусочки.
В этом кусочке, например, не видно, поправил ли ты frame_file. Там то же самое у тебя с путями.

Вот ты писал, например, что у тебя есть такая строка
Vseslav
19 # print (thumb_file)
А я вот что-то в твоём коде её не вижу. Значит, ты бросаешь сюда вообще не тот код, который запускаешь.

Не бросай кусочки и не бросай код, похожий на тот. Бросай его весь и именно тот.
Vseslav
Вот полный код с исправлением и всеми закомментированными строками, которые не исполняю, но иногда включаю для проверки
 #главный модуль сравнения
frames_path = "E:/My_prog/frames/"
analysis_path = "E:/My_prog/analysis/"
#print (analysis_path)
for frame_file in os.listdir(frames_path): #перебираем файлы фреймов
    frame_file_full = "%s%s"%(frames_path, frame_file)
    print (frame_file_full)
    difference = 2
    proper_image = ""
    frame = cv2.imread(frame_file_full, 0) #читаем фрейм
    frame_hist = cv2.calcHist([frame], [0], None, [256], [0, 256])   #строим гистограмму
#        print (frame_file)
#        plt.imshow(frame)
#        plt.show()
#        print (frame_hist)
    for thumb_file in os.listdir(analysis_path): #перебираем файлы для анализа
        thumb_file_full = "%s%s"%(analysis_path, thumb_file)
        print (thumb_file_full)
        thumb = cv2.imread(thumb_file_full, 0) #читаем файл для анализа
#      img = Image.open(thumb_file_full)
#      img.show()
        thumb_hist = cv2.calcHist([thumb], [0], None, [256], [0, 256])
#      print (thumb_file)
        plt.imshow(thumb)
        plt.show()
#      print (thumb_hist)
        img_hist_diff = cv2.compareHist(frame_hist, thumb_hist, cv2.HISTCMP_BHATTACHARYYA)
        img_template_probability_match = cv2.matchTemplate(frame_hist, thumb_hist, cv2.TM_CCOEFF_NORMED)[0][0]
        img_template_diff = 1 - img_template_probability_match
        commutative_image_diff = img_hist_diff + (img_template_diff/10)
        
        if difference>commutative_image_diff:
            difference = commutative_image_diff
            proper_image = thumb_file
            
#            print (frame_file)
#            plt.imshow(frame)
#            plt.show()
#            print (thumb_file)
#            plt.imshow(thumb)
#            plt.show()
        print (frame_file)
        print (proper_image)
        print (difference)

Вот полный вывод
 E:/My_prog/frames/frame_01_01.jpg
E:/My_prog/analysis/1.jpg
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-831e21202431> in <module>
     22         thumb_hist = cv2.calcHist([thumb], [0], None, [256], [0, 256])
     23 #        print (thumb_file)
---> 24         plt.imshow(thumb)
     25         plt.show()
     26 #        print (thumb_hist)
D:\Artur\Programming\Anaconda\lib\site-packages\matplotlib\pyplot.py in imshow(X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, data, **kwargs)
   2681         filternorm=filternorm, filterrad=filterrad, imlim=imlim,
   2682         resample=resample, url=url, **({"data": data} if data is not
-> 2683         None else {}), **kwargs)
   2684     sci(__ret)
   2685     return __ret
D:\Artur\Programming\Anaconda\lib\site-packages\matplotlib\__init__.py in inner(ax, data, *args, **kwargs)
   1599     def inner(ax, *args, data=None, **kwargs):
   1600         if data is None:
-> 1601             return func(ax, *map(sanitize_sequence, args), **kwargs)
   1602 
   1603         bound = new_sig.bind(ax, *args, **kwargs)
D:\Artur\Programming\Anaconda\lib\site-packages\matplotlib\cbook\deprecation.py in wrapper(*args, **kwargs)
    367                 f"%(removal)s.  If any parameter follows {name!r}, they "
    368                 f"should be pass as keyword, not positionally.")
--> 369         return func(*args, **kwargs)
    370 
    371     return wrapper
D:\Artur\Programming\Anaconda\lib\site-packages\matplotlib\cbook\deprecation.py in wrapper(*args, **kwargs)
    367                 f"%(removal)s.  If any parameter follows {name!r}, they "
    368                 f"should be pass as keyword, not positionally.")
--> 369         return func(*args, **kwargs)
    370 
    371     return wrapper
D:\Artur\Programming\Anaconda\lib\site-packages\matplotlib\axes\_axes.py in imshow(self, X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, **kwargs)
   5669                               resample=resample, **kwargs)
   5670 
-> 5671         im.set_data(X)
   5672         im.set_alpha(alpha)
   5673         if im.get_clip_path() is None:
D:\Artur\Programming\Anaconda\lib\site-packages\matplotlib\image.py in set_data(self, A)
    683                 not np.can_cast(self._A.dtype, float, "same_kind")):
    684             raise TypeError("Image data of dtype {} cannot be converted to "
--> 685                             "float".format(self._A.dtype))
    686 
    687         if not (self._A.ndim == 2
TypeError: Image data of dtype object cannot be converted to float

Vseslav
Пробовал также складывать путь к файлу с помощью os.path.join. Вот код
 #главный модуль сравнения
frames_path = r'E:\My_prog\frames'
analysis_path = r'E:\My_prog\analysis'
#print (analysis_path)
for frame_file in os.listdir(frames_path): #перебираем файлы фреймов
    frame_file_full = os.path.join(frames_path, frame_file)
    print (frame_file_full)
    difference = 2
    proper_image = ""
    frame = cv2.imread(frame_file_full, 0) #читаем фрейм
    frame_hist = cv2.calcHist([frame], [0], None, [256], [0, 256])   #строим гистограмму
    plt.imshow(frame)
    plt.show()
#        print (frame_hist)
    for thumb_file in os.listdir(analysis_path): #перебираем файлы для анализа
        thumb_file_full = os.path.join(analysis_path, thumb_file)
        print (thumb_file_full)
        thumb = cv2.imread(thumb_file_full, 0) #читаем файл для анализа
#        img = Image.open(thumb_file_full)
#        img.show()
        thumb_hist = cv2.calcHist([thumb], [0], None, [256], [0, 256])
#        print (thumb_file)
        plt.imshow(thumb)
        plt.show()
#        print (thumb_hist)
        img_hist_diff = cv2.compareHist(frame_hist, thumb_hist, cv2.HISTCMP_BHATTACHARYYA)
        img_template_probability_match = cv2.matchTemplate(frame_hist, thumb_hist, cv2.TM_CCOEFF_NORMED)[0][0]
        img_template_diff = 1 - img_template_probability_match
        commutative_image_diff = img_hist_diff + (img_template_diff/10)
        
        if difference>commutative_image_diff:
            difference = commutative_image_diff
            proper_image = thumb_file
            
#            print (frame_file)
#            plt.imshow(frame)
#            plt.show()
#            print (thumb_file)
#            plt.imshow(thumb)
#            plt.show()
        print (frame_file)
        print (proper_image)
        print (difference)
    

Выдаёт ту же самую ошибку.
При этом, если скормить этот путь функции Image.open, то изображение открывает. так что проблема, как мне видится, не в пути, а в cv2.imread
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB