脚本未循环遍历文件夹中的所有文件

问题描述 投票:0回答:1

我正在尝试创建一个脚本来遍历文件夹中的所有图像面孔,检测面孔并将其转换为灰度(用于 CNN 目的)

import cv2 import os

input_directory = r'C:\Users\Me\Desktop\Project\Python Files\TrainingPictures\Uncropped_Me' cascades_directory = r'C:\Users\Me\Desktop\Project\Python Files\haarcascade_frontalface_default.xml' output_directory = r'C:\Users\Me\Desktop\Project\Python Files\TrainingPictures\Cropped_Me_Grey'

if not os.path.exists(output_directory): os.makedirs(output_directory)

for filename in os.listdir(input_directory): input_path = os.path.join(input_directory, filename)
img = cv2.imread(input_path)
img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#identify and store x,y,w,h in array
haar_cascades = cv2.CascadeClassifier(cascades_directory)
faces = haar_cascades.detectMultiScale(img_grey, scaleFactor = 1.3, minNeighbors = 4)
print(f'Detected {len(faces)} in {filename}')

#Rectangle around around face, then crop, then save
for i,(x,y,w,h) in enumerate(faces):
    cv2.rectangle(img_grey, pt1 = (x,y), pt2 = ((x+w),(y+h)), color = (0,255,0), thickness = 2)
    faces_cropped = img_grey[y: y+h , x: x+w]

    output_filename = f'Cropped_Me_Grey_{i+1}.jpg'
    output_path = os.path.join(output_directory,output_filename)
    cv2.imwrite(output_path,faces_cropped)

print(faces_cropped.shape)
print(faces)

cv2.destroyAllWindows()

当我运行脚本时。它仅创建一个单一文件。当我打开文件时,它似乎循环遍历输入目录中的所有图像,但如果有意义的话,然后保存到前一个文件。

这表明它正确地循环了所有文件,但覆盖了它创建的最后一个文件。

这是否意味着我对“output_filename”有问题,我认为问题可能出在这里,但我不知道如何解决它。

python-3.x opencv operating-system haar-classifier
1个回答
0
投票

在第一个 for 循环中,您将迭代文件夹中的所有文件,但在每次迭代中,您都将覆盖

input_path
变量。结果,到循环结束时,
input_path
仅包含最后一张图像的路径。要解决此问题,您应该使用列表来存储所有文件路径。这样,您将能够保留文件夹中所有图像的路径。

© www.soinside.com 2019 - 2024. All rights reserved.