Форум сайта python.su
Доброго времени суток.Возникла необходимость нахождения наиболее подобных изображений в двух разных папках и формирования пар оригинал/подобие. Использую 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)
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]) #строим гистограмму
Офлайн
VseslavЧерез обычный print() выводи на экран все пути к файлам, которые открываешь. Так ты будешь знать, что именно ты открываешь, и так ты увидишь, что где-то путь неполный.
Т.е. изображение не может быть прочитано
Отредактировано py.user.next (Янв. 12, 2021 18:44:22)
Офлайн
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()
Отредактировано Vseslav (Янв. 12, 2021 18:55:37)
Офлайн
Скидывай полный код, который запускаешь, не надо бросать кусочки.
В этом кусочке, например, не видно, поправил ли ты frame_file. Там то же самое у тебя с путями.
Вот ты писал, например, что у тебя есть такая строка
VseslavА я вот что-то в твоём коде её не вижу. Значит, ты бросаешь сюда вообще не тот код, который запускаешь.19 # print (thumb_file)
Отредактировано py.user.next (Янв. 12, 2021 20:29:14)
Офлайн
Вот полный код с исправлением и всеми закомментированными строками, которые не исполняю, но иногда включаю для проверки
#главный модуль сравнения 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
Офлайн
Пробовал также складывать путь к файлу с помощью 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)
Офлайн