如何制作目录&把图像放在目录中?
我在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
文件夹的方法我错了吗?
答案 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()
生成器函数将传回所有文件,包括目录,因此您需要添加一些逻辑来检测图像文件并过滤掉那些不需要的文件。