Я написал код, который открывает папку и сравнивает содержащиеся изображения друг с другом. Я пытаюсь заставить его применять рекурсивно ко всем подкаталогам в папке.
Я не могу использовать recurse параметр iglob , потому что он недоступен в python 2. Я должен использовать python 2, потому что код основан на алгоритме SIFT opencv, который является только доступно для python 2. Я не хочу пробовать компиляцию для python 3, потому что мне нужно передать код кому-то другому, и они могут не выполнить компиляцию.
Вот рабочий код в iglob - доказательство того, что cv2 правильно читает изображение, состоит в том, что image1 печатает список точек, представляющих изображение:
import cv2 #opencv 3.4.2.16 and opencv-contrib - https://pypi.org/project/opencv-python/3.4.2.16/
import glob
for a in glob.iglob(r"/home/kate/Downloads/images/*"):
for b in glob.iglob(r"/home/kate/Downloads/images/*"):
image1 = cv2.imread(a)
print image1
image2 = cv2.imread(b)
print image2
Вот моя попытка изменить его на os.walk
:
path = "/home/kate/Downloads/images/"
for a in os.walk(path):
for b in os.walk(path):
image1 = cv2.imread(os.path.join(path,a))
print image1
image2 = cv2.imread(os.path.join(path,b))
print image2
Код ошибки:
Traceback (most recent call last):
File "/home/kate/hello/test3.py", line 31, in <module>
image2 = cv2.imread(os.path.join(path,a))
File "/usr/lib64/python2.7/posixpath.py", line 68, in join
if b.startswith('/'):
AttributeError: 'tuple' object has no attribute 'startswith'
Итак, я проверил type
«а» в обоих фрагментах кода и в рабочем коде «а» это строка В нерабочем коде это кортеж, а именно кортеж, состоящий из трех массивов: root, каталогов и файлов. Итак, я изменил это на следующее:
path = "/home/kate/Downloads/images"
for root, dirs, a in os.walk(path):
for root, dirs, b in os.walk(path):
print a
print b
Но теперь «a» - это массив, состоящий из имен файлов. Нужно ли запускать другой for-l oop, чтобы получить каждое имя файла отдельно?