我正在尝试创建一个脚本来遍历文件夹中的所有图像面孔,检测面孔并将其转换为灰度(用于 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”有问题,我认为问题可能出在这里,但我不知道如何解决它。
在第一个 for 循环中,您将迭代文件夹中的所有文件,但在每次迭代中,您都将覆盖
input_path
变量。结果,到循环结束时,input_path
仅包含最后一张图像的路径。要解决此问题,您应该使用列表来存储所有文件路径。这样,您将能够保留文件夹中所有图像的路径。