python - Eigenfaces 训练图像像素大小误差

标签 python opencv

各位资深程序员大家好!我在特征脸图像训练部分有一个错误。

错误是:OpenCV 错误:不支持的格式或格式组合(在 Eigenfaces 方法中,所有输入样本(训练图像)必须大小相同!预期为 27889 像素,但为 27556 像素。)在 cv::face::Eigenfaces 中: :train,文件 C:\projects\opencv-python\opencv_contrib\modules\face\src\eigen_faces.cpp,第 68 行

这意味着我的图片大小不一样。当我从相机捕捉照片时,我尝试使用 cv2.rezise(),但它仍然不起作用。

这是我的捕获代码:

import cv2
cam = cv2.VideoCapture(0)
detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

Id = input('enter your id: ')
sampleNum = 0

while(True):
    ret, img = cam.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, 1.3, 5)

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

        sampleNum = sampleNum+1

        cv2.imwrite("dataSet/user."+Id+'.'+str(sampleNum)+".jpg",cv2.resize
        (gray[y:y+h,x:x+w],(70,70)))

        cv2.imshow('frame',img)

    if cv2.waitKey(100) & 0xFF == ord('q'):#waitKey is for delay in video capture
        break
    elif sampleNum >= 50:#how many picture capture?
        break

cam.release()
cv2.destroyAllWindows()

这是培训部分:
import cv2,os
import numpy as np


recognizer = cv2.face.EigenFaceRecognizer_create()
detector= cv2.CascadeClassifier("haarcascade_frontalface_default.xml")


def getImagesAndLabels(path):

    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    faceSamples=[]
    Ids=[]

    for imagePath in imagePaths:

        pilImage = Image.open(imagePath).convert('L')

        imageNp = np.array(pilImage,'uint8')

        Id = int(os.path.split(imagePath)[-1].split(".")[1])

        faces = detector.detectMultiScale(imageNp)

        for (x,y,w,h) in faces:
            faceSamples.append(imageNp[y:y+h,x:x+w])
            Ids.append(Id)

     return faceSamples,Ids

faces,Ids = getImagesAndLabels('dataSet')
recognizer.train(faces, np.array(Ids))
recognizer.write('trainner/trainnerEi.yml')

PS。我从 LBPHFaceRecognizer 改编这段代码
谢谢!*3

最佳答案

  • 好的,所以 EigenFaces 仅在像素空间中所有图像的尺寸相同时才有效
  • 这意味着如果训练中使用的一张图像大小为 28x28,那么训练和测试中的所有其他图像的大小必须为 28x28
  • 如果图像大小不同,那么 opencv 会抛出错误
  • 该错误只是说其中一张图像的像素空间为 27889 维,而另一张图像的像素空间为 27556 维。
  • 我建议您使用 cv2.resize()使所有图像大小相同的函数
  • 使用以下代码作为您培训部分的引用:
    import cv2,os
    import numpy as np
    
    
    recognizer = cv2.face.EigenFaceRecognizer_create()
    detector= cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
    
    
    def getImagesAndLabels(path):
        width_d, height_d = 280, 280  # Declare your own width and height
        imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
        faceSamples=[]
        Ids=[]
    
        for imagePath in imagePaths:
    
            pilImage = Image.open(imagePath).convert('L')
    
            imageNp = np.array(pilImage,'uint8')
    
            Id = int(os.path.split(imagePath)[-1].split(".")[1])
    
            faces = detector.detectMultiScale(imageNp)
    
            for (x,y,w,h) in faces:
                ########################################                       
                # The line to be changed by cv2.resize()
                ########################################
                faceSamples.append(cv2.resize(imageNp[y:y+h,x:x+w], (width_d, height_d))
                Ids.append(Id)
    
        return faceSamples,Ids
    
    faces,Ids = getImagesAndLabels('dataSet')
    recognizer.train(faces, np.array(Ids))
    recognizer.write('trainner/trainnerEi.yml')
    
  • 请记住,即使测试图像也必须具有相同的大小
  • 关于python - Eigenfaces 训练图像像素大小误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47937122/

    相关文章:

    opencv - 使用 opencv 从眼睛玩具网络摄像头流式传输视频时出现 HIGHGUI 错误

    python - 如果在另一个数据框中找到重复项,如何从一个数据框中删除重复项

    python - 如何使用线条和标记绘制重叠系列?

    opencv - OpenCV findHomography和WarpPerspective效果不佳

    c++ - 从数组创建 Mat 时,类型 'cv::Mat' 和 'int' 不兼容

    linux - CMAKE opencv 更改构建文件夹

    java - 将电脑上的C++opencv项目转成opencv android的步骤

    Python:和/或运算符奇怪的行为

    python - 根据 DataFrame 标准仅更改 1 个单元格的值

    python - 使用xterm打开新控制台: How to while the current console is printing,也在新控制台上打印