如何从目录中读取图像? (Python OpenCV)

时间:2017-12-28 05:12:03

标签: python opencv

我写了以下代码:

import os
import cv2
import random
from pathlib import Path

path = Path(__file__).parent
path = "../img_folder"
for f in path.iterdir():

    f = str(f)

    img=cv2.imread(f)

    im_height = img.shape[0]
    im_width = img.shape[1]

但是当我运行此代码时,我收到以下错误:

  

AttributeError:'NoneType'对象在im_height = img.shape [0]中没有属性'shape'。

我想我无法访问图片,因此我写了print(img)print(type(omg))以及无&退回。 img_folder是一个包含10张图片的文件夹。当我打印f时,我得到:

  

../ img_folder / .DS_Store

我不知道为什么.DS_Store被包含,因为img_folder只有图像。我该怎么解决这个问题?我该怎么写呢?为什么我无法访问图像?

3 个答案:

答案 0 :(得分:2)

您已发布至少三个关于使用“PostPath”获取文件名的问题。不好。

更好的方法是使用glob.glob来获取特定类型的文件名。

$ tree .
├── a.txt
├── feature.py
├── img01.jpg
├── img01.png
├── imgs
│   ├── img02.jpg
│   └── img02.png
├── tt01.py
├── tt02.py
└── utils.py

1 directory, 9 files

从当前目录:

import glob
import itertools

def getFilenames(exts):
    fnames = [glob.glob(ext) for ext in exts]
    fnames = list(itertools.chain.from_iterable(fnames))
    return fnames


## get `.py` and `.txt` in current folder
exts = ["*.py","*.txt"]
res = getFilenames(exts)
print(res)
# ['utils.py', 'tt02.py', 'feature.py', 'tt01.py', 'a.txt']


# get `.png` in  current folder and subfolders
exts = ["*.png","*/*.png"]
res = getFilenames(exts)
print(res)
# ['img01.png', 'imgs/img02.png']

答案 1 :(得分:1)

Finder文件是一种隐藏文件,它是在各种目录中自动生成的(仅在Mac OS上),您可能已使用{{1应用程序。我想这是一种缓存文件,可以在Finder中快速轻松地呈现目录结构。我发现如果我不用我的Finder应用程序打开目录,它就不会被创建。

要防止出现此类错误,您必须始终检查您要阅读的文件是否具有有效的扩展名。可以这样做:

import os

for file_name in os.listdir("/path/to/your/directory"):
    if file_name.split(".")[-1].lower() in {"jpeg", "jpg", "png"}:
        img = cv2.imread("/path/to/your/directory/" + file_name)

答案 2 :(得分:0)

这是因为您的目录中存在隐藏文件。如果您确定目录中只包含图像,则可以忽略隐藏的文件/文件夹,如下所示。

使用

for f in path.iterdir():
    if not f.startswith('.'):

      f = str(f)

      img=cv2.imread(f)

      im_height = img.shape[0]
      im_width = img.shape[1]