2015-10-21 31 views
2

我在使用OpenCV和Python創建臉部識別系統時遇到了一些麻煩。我試圖使用由菲利普·瓦格納給出的文檔,我有以下代碼:'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

謝謝!現在還不算太晚,因爲其他人正試圖使用​​此代碼。 –