我怎样才能制作目录&把图像放在目录中?

时间:2018-01-31 08:17:15

标签: python

如何制作目录&把图像放在目录中? 我在data.py中编写了以下代码:

import os
import cv2
import argparse
import numpy as np
import math

parser = argparse.ArgumentParser(description='')
parser.add_argument('input_dir' ,help='input directory')
parser.add_argument('output_dir' ,help='out directory')

args = parser.parse_args()

def find_all_files(directory):
    for root, dirs, files in os.walk(directory):

        for file in files:
            p=os.path.join(root, file)
            p=p.split("/")[len(p.split("/"))-2]
            name, ext = os.path.splitext(p)

            yield os.path.join(root, file)

dirname=args.output_dir
if not os.path.exists(dirname):
    os.mkdir(dirname)


folder_img = find_all_files(args.input_dir)
im =cv2.imread(folder_img)
cv2.imwrite(args.output_dir ,im)

现在,当我运行命令python data.py ./photo ./copy_photo时,在函数imwrite中找到指定扩展名的编写器。我想创建一个目录copy_photo并将此代码生成的图像放在目录中。制作了copy_photo文件夹,我的代码出了什么问题?我该怎么解决这个问题?写下将图像放入copy_photo文件夹的方法我错了吗?

2 个答案:

答案 0 :(得分:1)

cv2.imread()接受单个文件名,但您使用(生成器返回)文件列表来调用它。

试试这个:

def find_all_files(directory):
    for root, dirs, files in os.walk(directory):

        for file in files:
            # Comment out dead code
            '''
            p=os.path.join(root, file)
            p=p.split("/")[len(p.split("/"))-2]
            name, ext = os.path.splitext(p)
            '''

            # Changed this to return a tuple
            yield root, file

for dirname, imagefile in find_all_files(args.input_dir):
    im =cv2.imread(os.path.join(dirname, imagefile))
    cv2.imwrite(os.path.join(args.output_dir, imagefile), im)

因为imwrite()需要接收文件名参数,所以我更改了find_all_files以返回元组,因此您可以对输出使用相同的文件名,并选择您在前面添加的目录名。 / p>

然而,重写图像似乎是一种非常低效的方法。为什么不简单地复制文件?

答案 1 :(得分:1)

find_all_files是一个生成器。变量folder_img将绑定到该生成器。在该生成器上调用cv2.imread()不起作用,因为imread()需要一个图像文件,而不是生成器。

您需要在生成器上迭代以逐个复制每个文件。像这样:

folder_img = find_all_files(args.input_dir)
for filename in find_all_files(args.input_dir):
    im = cv2.imread(filename)
    cv2.imwrite(os.path.join(args.output_dir, os.path.basename(filename)), im)

另请注意,args.output_dir是表示desination目录名称的字符串。您需要指定文件的路径,包括目录。使用os.path.join()os.path.basename()即可。

如果你想要做的就是将文件从一个目录复制到另一个目录,那么你应该使用shutil.copytree,因为没有必要打开图像文件,然后将它们写回来。此外,您的find_all_files()生成器函数将传回所有文件,包括目录,因此您需要添加一些逻辑来检测图像文件并过滤掉那些不需要的文件。