首页 > 解决方案 > 用于读取图像的嵌套 for 循环

问题描述

我编写了一个代码,可以打开一个文件夹并将包含的图像相互比较。我试图让它递归地应用于文件夹中的所有子目录。

我不能使用 iglob 的递归参数,因为它在 python 2 中不可用。我必须使用 python 2,因为代码依赖于 opencv 的 SIFT 算法,该算法仅适用于 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两段代码中的“a”,在工作代码中,“a”是一个字符串。在非工作代码中,它是元组——具体来说,它是一个由三个数组组成的元组:根、目录和文件。所以,我把它改成这样:

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 循环来单独获取每个文件名?

标签: python-2.7opencvfilesystems

解决方案


推荐阅读