从文件夹中读取所有图像并检测面部,裁剪并保存到新文件夹

时间:2019-01-03 10:25:07

标签: python opencv image-processing mat

我正在尝试建立一个模型,在该模型中它将读取给定文件夹中的所有图像,并检测面部,裁剪并将裁剪后的面部保存到新文件夹中!

有人在收到错误消息时可以帮助我提供代码:

cv2.imshow(str(img) , img)

TypeError: mat is not a numpy array, neither a scalar

代码:

import glob 
import cv2
import sys
while 1 :
    filename = input("Enter the file name in which images are present =")
    for img in glob.glob(filename+'/*.*'):
        #try :
            var_img = cv2.imread(img)
            cv2.imshow(str(img) , var_img)

    def detect_face(img):

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        face_cascade = cv2.CascadeClassifier('opencv-files/lbpcascade_frontalface.xml')
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5);

        if (len(faces) == 0):
            return None, None

        (x, y, w, h) = faces[0]
        return gray[y:y+w, x:x+h], faces[0]
    cv2.imshow(str(img) , img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2 个答案:

答案 0 :(得分:0)

您似乎要显示文件名而不是实际数组。 glob.glob返回文件名列表,因此您要显示的img只是一个字符串。在显示图像之前,您需要先阅读图像。您在以下行中完成了此操作:var_img = cv2.imread(img),因此这意味着您的数组为var_img。但是后来您尝试仅使用img重新显示。您只能显示var_img这是一个数组,而不能显示img这是一个字符串。

答案 1 :(得分:0)

尝试

import glob 
import cv2
import sys
import os
def detect_face(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    face_cascade = cv2.CascadeClassifier('opencvfiles/lbpcascade_frontalface.xmlv')
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
    return faces

filename = input("Enter the file name in which images are present =")

for img in glob.glob(filename+'/*.*'):
    var_img = cv2.imread(img)
    face = detect_face(var_img)
    print(face)
    if (len(face) == 0):
        continue
    for(ex, ey, ew, eh) in face:
        crop_image = var_img[ey:ey+eh, ex:ex+ew]
        cv2.imshow("cropped", crop_image)
        cv2.waitKey(0)  
    cv2.imwrite(os.path.join("outputs/",str(img)),crop_image)