2017-12-22 15 views
0

안녕하세요 모든 수석 프로그래머에게! eigenfaces 이미지 훈련 부분에 오류가 있습니다.Eigenfaces 교육 이미지 픽셀 크기 오류

오류 : OpenCV 오류 : 지원되지 않는 형식 또는 형식 조합 (모든 입력 샘플 (교육 이미지)은 동일한 크기 여야합니다! 예상되는 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

+0

왜 크기가 변경된 얼굴 이미지가 감지되면 다시 'getImagesAndLabels'을 사용합니까? – Silencer

+0

진실은 내가 모른다. 나는 LBPHFaceRecognizer를 위해 youtube에서이 코드를 얻는다. 노인 도와주세요. – LotOfQuestion

답변

0
  • 좋아요를 고유 얼굴에만 작동 그래서 모든 이미지의 크기가 픽셀 공간에서 동일한 경우 훈련에 사용 된 하나 개의 이미지가 크기 28X28의 경우 의미
  • 그럼 훈련뿐만 아니라 테스트의 모든 다른 이미지 크기가 28x28이어야합니다
  • 이미지 크기가 같지 않으면 opencv는 오류
  • 을 던집니다 오류는 단순히 이미지 중 하나가 27889 픽셀 공간에서의 치수 및 기타는 27556 ​​차원 픽셀 공간이었습니다.

    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') 
    
  • 마음도 시험하십시오 :

  • 난 당신 같은 크기
  • 사용 당신을위한 참고로 아래의 코드 훈련 부분의 모든 이미지를 만들기 위해 cv2.resize() 기능을 사용하는 것이 좋습니다 이미지의 크기가 같아야합니다.

+0

고마워요! Senior : D – LotOfQuestion

+0

나는 도움이되었다 니 다행이다. D – Jai