2015-10-21 8 views
2

У меня возникли проблемы с созданием системы распознавания лиц с OpenCV и Python. Я пытался использовать документацию, данное Philipp Вагнера, и у меня есть следующий код:'объект cv2.face_BasicFaceRecognizer' не имеет атрибута 'getParams' Python

import os 
import sys 
import cv2 
import numpy as np 

def normalize(X, low, high, dtype=None): 
    """Normalizes a given array in X to a value between low and high.""" 
    X = np.asarray(X) 
    minX, maxX = np.min(X), np.max(X) 
    # normalize to [0...1]. 
    X = X - float(minX) 
    X = X/float((maxX - minX)) 
    # scale to [low...high]. 
    X = X * (high-low) 
    X = X + low 
    if dtype is None: 
     return np.asarray(X) 
    return np.asarray(X, dtype=dtype) 


def read_images(path, sz=None): 
    """Reads the images in a given folder, resizes images on the fly if size is given. 
    Args: 
     path: Path to a folder with subfolders representing the subjects (persons). 
     sz: A tuple with the size Resizes 
    Returns: 
     A list [X,y] 

      X: The images, which is a Python list of numpy arrays. 
      y: The corresponding labels (the unique number of the subject, person) in a Python list. 
    """ 
    c = 0 
    X,y = [], [] 
    for dirname, dirnames, filenames in os.walk(path): 
     for subdirname in dirnames: 
      subject_path = os.path.join(dirname, subdirname) 
      for filename in os.listdir(subject_path): 
       try: 
        im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE) 
       # resize to given size (if given) 
        if (sz is not None): 
         im = cv2.resize(im, sz) 
        X.append(np.asarray(im, dtype=np.uint8)) 
        y.append(c) 
       except IOError, (errno, strerror): 
        print "I/O error({0}): {1}".format(errno, strerror) 
       except: 
        print "Unexpected error:", sys.exc_info()[0] 
        raise 
      c = c+1 
    return [X,y] 

if __name__ == "__main__": 
    out_dir = None 

    if len(sys.argv) < 2: 
     print "USAGE: facerec_demo.py </path/to/images> [</path/to/store/images/at>]" 
     sys.exit() 

    [X,y] = read_images(sys.argv[1]) 

    y = np.asarray(y, dtype=np.int32) 
    # If a out_dir is given, set it: 
    if len(sys.argv) == 3: 
     out_dir = sys.argv[2] 

    model = cv2.face.createEigenFaceRecognizer() 
    model.train(np.asarray(X), np.asarray(y)) 
    model.save('individual.xml') 

    [p_label, p_confidence] = model.predict(np.asarray(X[0])) 
    # Print it: 
    print "Predicted label = %d (confidence=%.2f)" % (p_label, p_confidence) 

    print model.getParams() 
    # Now let's get some data: 
    mean = model.getMat("mean") 
    eigenvectors = model.getMat("eigenvectors") 
    # We'll save the mean, by first normalizing it: 
    mean_norm = normalize(mean, 0, 255, dtype=np.uint8) 
    mean_resized = mean_norm.reshape(X[0].shape) 
    if out_dir is None: 
     cv2.imshow("mean", mean_resized) 
    else: 
     cv2.imwrite("%s/mean.png" % (out_dir), mean_resized) 
    for i in xrange(min(len(X), 16)): 
     eigenvector_i = eigenvectors[:,i].reshape(X[0].shape) 
     eigenvector_i_norm = normalize(eigenvector_i, 0, 255, dtype=np.uint8) 
     if out_dir is None: 
      cv2.imshow("%s/eigenface_%d" % (out_dir,i), eigenvector_i_norm) 
     else: 
      cv2.imwrite("%s/eigenface_%d.png" % (out_dir,i), eigenvector_i_norm) 

    if out_dir is None: 
     cv2.waitKey(0) 

Но это держит меня получаю следующее сообщение об ошибке:

print model.getParams() 
AttributeError: 'cv2.face_BasicFaceRecognizer' object has no attribute 'getParams' 

Любая идея, почему я не могу получить любые параметры? Я думал, что это возможно из-за включения подмодуля cv2.face, и поэтому это может быть альтернатива model.getParams(), а также getMat(), но я просто догадываюсь ... Спасибо заранее.

+0

Посмотреть [это] (http://stackoverflow.com/a/33262964/5008845) ответ – Miki

ответ

1

Возможно, уже слишком поздно, но это то, что я сделал.

Во-первых, чтобы увидеть список методов, которые поддерживает ваш cv2.face

model = cv2.face.createEigenFaceRecognizer() 
help (model) 

И как вы заметите, есть некоторые изменения больше не используются: model.getMat ("mean") теперь только используется mean = model.getMean().

Я надеюсь, что это помогает :)

+0

Спасибо! Это не слишком поздно, потому что другие люди пытаются использовать этот код. –

 Смежные вопросы

  • Нет связанных вопросов^_^