cv2.imread 适用于一个文件,但在迭代 os.listdir() 时无效

cv2.imread works with one file but not when iterating os.listdir()

我尝试使用 cv.imread() 函数将几张图像导入 opencv。 我认为我给出 imread().

路径的方式有问题

一个文件就可以:

cv.imread('data/img.png')

但是在 for 循环中:

imgs = os.listdir('./data')
targets = []
for img in imgs:
    target = cv.imread(img)
    targets.append(target)

我一直得到一个充满 None 个值的数组,这意味着 opencv 没有加载文件。

print(img) 给我一个像 ['btn1.png','btn2.png','btn3.png'] 这样的输出,这对我来说似乎很好:它是一个字符串列表。

我在这里做错了什么,为什么这个字符串没有像打印给我一样传递给我?

问题是 imgs 包含图像的文件名,但它们不是完整的文件路径,因此您的程序找不到您的图像文件。

尝试将您的程序修改为

root_dir = './data'
imgs = [os.path.join(root_dir, f) for f in os.listdir(root_dir)]
targets = []
for img in imgs:
    target = cv2.imread(img)
    targets.append(target)

os.listdir 给出文件名,而不是它的路径。您需要重新添加路径或使用包含路径的不同 API。 glob.glob(os.path.join("path", "*.png")) 会做的。但是你也可以使用 pathlib

from pathlib import Path
targets = [cv.imread(path) for path in Path("data").glob("*.png")]