Прочитать все изображения из папки и определить лица, обрезать и сохранить в новую папку - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь построить модель, в которой она будет считывать все изображения из заданной папки и обнаруживать лицо, обрезать и сохранять обрезанное лицо в новой папке!

Может ли кто-нибудь помочь мне с кодом, поскольку я получаю сообщение об ошибке:

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 голосов
/ 04 января 2019

попробуйте

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)
0 голосов
/ 04 января 2019

Похоже, вы пытаетесь отобразить имя файла вместо реального массива. glob.glob возвращает список имен файлов, поэтому ваши img, которые вы пытаетесь imshow, являются просто строкой. Вы должны прочитать изображение, прежде чем его показать. Вы сделали это в этой строке: var_img = cv2.imread(img), что означает, что ваш массив равен var_img. Но позже вы снова попытались imshow, используя img. Вы можете только imshow var_img, который является массивом, а не img, который является строкой.

...