cv2.Imread对一个文件起作用,但在迭代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")]