Есть ли более быстрый способ найти каждое изображение со всего компьютера? - PullRequest
2 голосов
/ 14 июля 2020

Я использую эту функцию для поиска изображений, но на самом деле это очень медленно. Интересно, есть ли более быстрый способ сделать это.


import os
import cv2
images = []
def load_images_from_folder(folder):
    global images
    os.chdir(folder)
    for filename in os.listdir(folder):
        if os.path.isdir(os.path.join(folder,filename)):
            try:
                load_images_from_folder(os.path.join(folder, filename))
            except:
                pass
        img = cv2.imread(os.path.join(folder,filename))
        if img is not None:
            images.append(img)
load_images_from_folder("C:\\")

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Как рекомендовано в этом ответе , вы можете использовать встроенный модуль imghdr , чтобы проверить, является ли файл изображением:

import imghdr
import os

def get_images(root_directory):
    images = []
    for root, dirs, filenames in os.walk(root_directory):
        for filename in filenames:
            path = os.path.join(root, filename)
            if imghdr.what(path) is not None:
                images.append(path)
    return images

Но imghdr модуль обнаруживает только несколько типов изображений, согласно документации он не может обнаружить swg.

Как предложил @NiklasMertsch, вы можете просто проверить такие расширения файлов изображений:

import os

extensions = [
    '.png',
    '.jpg',
    '.jpeg',
    '.bmp',
    '.gif',
    '.tiff',
    '.swg',
]

def get_images(root_directory):
    images = []
    for root, dirs, filenames in os.walk(root_directory):
        for filename in filenames:
            for extension in extensions:
                if filename.endswith(extension):
                    images.append(os.path.join(root, filename))
                    break
    return images
1 голос
/ 14 июля 2020

Для этого вы можете использовать библиотеку treeHandler. Вы можете установить его, используя pip install treeHandler

from treeHandler import treeHandler
import os
import cv2
inputFolder='SampleData'

### initialising treeHandler object
th=treeHandler()
### calling getFiles function to get all jpg files, you can add more extensions like ['jpg','png','bmp'] if required
fileTuple=th.getFiles(inputFolder,['jpg'])

Вот как выглядит образец fileTuple:

[('image01.jpg', 'sampleData'),  ('image02.jpg', 'sampleData'),  ('image03.jpg', 'sampleData'),  ('image04.jpg', 'sampleData'),  ('image11.jpg', 'sampleData/folder1'),  ('image12.jpg', 'sampleData/folder1'),  ('image111.jpg', 'sampleData/folder1/folder11'),  ('image112.jpg', 'sampleData/folder1/folder11'),  ('image1111.jpg', 'sampleData/folder1/folder11/folder111'),  ('image1112.jpg', 'sampleData/folder1/folder11/folder111'),  ('image11111.jpg', 'sampleData/folder1/folder11/folder111/folder1111')....]

Я написал блог об обработке большого количества файлов и их обработке

https://medium.com/@sreekiranar / directory-and-file-handle-in- python -for-real-world-projects-9bc8baf6ba89

Вы можете сослаться на это, чтобы получить честная идея о том, как бороться с получением всех файлов из папок и подпапок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...