Вложен для l oop для чтения изображений - PullRequest
0 голосов
/ 06 апреля 2020

Я написал код, который открывает папку и сравнивает содержащиеся изображения друг с другом. Я пытаюсь заставить его применять рекурсивно ко всем подкаталогам в папке.

Я не могу использовать 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, чтобы получить каждое имя файла отдельно?

...