执行python代码时没有任何反应(Eigenface)

时间:2018-04-23 11:10:42

标签: python opencv image-processing eigenvector cv2

我是图像处理领域的新手,并使用Opencv库.Blow是一个使用Python中的Eigenface算法进行人脸识别的代码(包含在blow链接中的数据集)。我从learnopencv获得执行Eigenface代码的结果有问题,这是我运行Eigenface.py时得到的全部

  

从F:\ learnopencv-master \ EigenFace \ images ...

中读取图像

我正在使用:

winpython-3.4.2.2.amd64

任何想法都会有所帮助......!谢谢

from __future__ import print_function
import os
import sys
import cv2
import numpy as np

# Create data matrix from a list of images
def createDataMatrix(images):
    print("Creating data matrix",end=" ... ")
    ''' 
    Allocate space for all images in one data matrix.
  The size of the data matrix is

  ( w  * h  * 3, numImages )

  where,

  w = width of an image in the dataset.
  h = height of an image in the dataset.
  3 is for the 3 color channels.
  '''

    numImages = len(images)
    sz = images[0].shape
    data = np.zeros((numImages, sz[0] * sz[1] * sz[2]), dtype=np.float32)
    for i in xrange(0, numImages):
        image = images[i].flatten()
        data[i,:] = image

    print("DONE")
    return data

# Read images from the directory
def readImages(path):
  print("Reading images from " + path, end="...")
  # Create array of array of images.
  images = []
  # List all files in the directory and read points from text files one by one
  for filePath in sorted(os.listdir(path)):
    fileExt = os.path.splitext(filePath)[1]
    if fileExt in [".jpg", ".jpeg"]:

      # Add to array of images
      imagePath = os.path.join(path, filePath)
      im = cv2.imread(imagePath)

      if im is None :
        print("image:{} not read properly".format(imagePath))
      else :
          # Convert image to floating point
          im = np.float32(im)/255.0
          # Add image to list
          images.append(im)
          # Flip image 
          imFlip = cv2.flip(im, 1);
          # Append flipped image
          images.append(imFlip)

  numImages = len(images) / 2
  # Exit if no image found
  if numImages == 0 : print("No images found") 
  sys.exit(0)

  print(str(numImages) + " files read.")
  return images

# Add the weighted eigen faces to the mean face 
def createNewFace(*args):
    # Start with the mean image
    output = averageFace

    # Add the eigen faces with the weights
    for i in xrange(0, NUM_EIGEN_FACES):
        '''
        OpenCV does not allow slider values to be negative. 
        So we use weight = sliderValue - MAX_SLIDER_VALUE / 2
        ''' 
        sliderValues[i] = cv2.getTrackbarPos("Weight" + str(i), "Trackbars");
        weight = sliderValues[i] - MAX_SLIDER_VALUE/2
        output = np.add(output, eigenFaces[i] * weight)

    # Display Result at 2x size
    output = cv2.resize(output, (0,0), fx=2, fy=2)
    cv2.imshow("Result", output)

def resetSliderValues(*args):
    for i in xrange(0, NUM_EIGEN_FACES):
        cv2.setTrackbarPos("Weight" + str(i), "Trackbars", MAX_SLIDER_VALUE/2); 
    createNewFace()

if __name__ == '__main__':

    # Number of EigenFaces
    NUM_EIGEN_FACES = 10

    # Maximum weight
    MAX_SLIDER_VALUE = 255

    # Directory containing images
    dirName = "F:\learnopencv-master\EigenFace\images"

    # Read images
    images = readImages(dirName)

    # Size of images
    sz = images[0].shape

    # Create data matrix for PCA.
    data = createDataMatrix(images)

    # Compute the eigenvectors from the stack of images created
    print("Calculating PCA ", end="...")
    mean, eigenVectors = cv2.PCACompute(data, mean=None, maxComponents=NUM_EIGEN_FACES)
    print ("DONE")

    averageFace = mean.reshape(sz)

    eigenFaces = []; 

    for eigenVector in eigenVectors:
        eigenFace = eigenVector.reshape(sz)
        eigenFaces.append(eigenFace)

    # Create window for displaying Mean Face
    cv2.namedWindow("Result", cv2.WINDOW_AUTOSIZE)

    # Display result at 2x size
    output = cv2.resize(averageFace, (0,0), fx=2, fy=2)
    cv2.imshow("Result", output)

    # Create Window for trackbars
    cv2.namedWindow("Trackbars", cv2.WINDOW_AUTOSIZE)

    sliderValues = []

    # Create Trackbars
    for i in xrange(0, NUM_EIGEN_FACES):
        sliderValues.append(MAX_SLIDER_VALUE/2)
        cv2.createTrackbar( "Weight" + str(i), "Trackbars", MAX_SLIDER_VALUE/2, MAX_SLIDER_VALUE, createNewFace)

    # You can reset the sliders by clicking on the mean image.
    cv2.setMouseCallback("Result", resetSliderValues);

    print('''Usage:
    Change the weights using the sliders
    Click on the result window to reset sliders
    Hit ESC to terminate program.''')

    cv2.waitKey(0)
    cv2.destroyAllWindows()

1 个答案:

答案 0 :(得分:0)

您的示例以静默方式退出,因为您的函数readImages中有sys.exit(0),无条件执行。

所以而不是:

  if numImages == 0 : print("No images found") 
  sys.exit(0)

应该是:

  if numImages == 0 :
      print("No images found")
      sys.exit(0)

这是correct on GitHub