0

Ms Access 데이터베이스에서 교육 세트를로드하는 데 어려움을 겪고있었습니다. 얼굴 인식. 그들의 이름과 ID를 가진 훈련 세트를 OLE Object 형식의 이진 데이터로 데이터베이스에 저장했습니다. 데이터베이스에서 훈련 세트로 변경, 저장 및 읽는 데 사용한 방법은C# - Emgu Cv - 얼굴 인식 - 얼굴 인식을 위해 EigenObjectRecognizer에 바이너리로 Access 데이터베이스에 저장된 얼굴 세트를로드합니다.

private static byte[] ConvertImageToBytes(Image InputImage) 
    { 
     using (Bitmap BmpImage = new Bitmap(InputImage)) 
     { 
      using (MemoryStream MyStream = new MemoryStream()) 
      { 
       BmpImage.Save(MyStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
       byte[] ImageAsBytes = MyStream.ToArray(); 
       return ImageAsBytes; 
      } 
     } 
    } 
i가 데이터베이스로 변환 된 바이트 데이터를 저장하는 데 사용

방법은 다음

private void StoreData(byte[] ImageAsBytes,String NameStudent,String IDStudent) 
    { 

     if (DBConnection.State.Equals(ConnectionState.Closed)) 
      DBConnection.Open(); 
     try 
     { 

      //MessageBox.Show("Saving image at index : " + rowPosition); 
      using (OleDbCommand insert = new OleDbCommand(String.Format("Insert INTO 
       TrainingSet(rowPosition,StudentName,StudentID,StudentFace) values (' 
       {0}','{1}','{2}',@StudentFace)", rowPosition, NameStudent, IDStudent), 
       DBConnection)) 
      { 
     OleDbParameter imageParameter = insert.Parameters.AddWithValue(@"StudentFace", 
        SqlDbType.Binary); 
     imageParameter.Value = ImageAsBytes; 
     imageParameter.Size = ImageAsBytes.Length; 
     int rowsAffected = insert.ExecuteNonQuery(); 
     MessageBox.Show(String.Format("Data stored successfully in {0} 
             Row",rowsAffected)); 
     } 
      rowPosition++; 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      RefreshDBConnection(); 
     } 
     } 

난 다음 바이너리 데이터 판독에 사용하는 방법 :

private Image ReadImageFromDB() 
    { 

     Image FetchedImg; 
     if (rowNumber >= 0) 
     { 

     byte[] FetchedImgBytes = (byte[])LocalDataTable.Rows[rowNumber]["StudentFace"]; 
      MemoryStream stream = new MemoryStream(FetchedImgBytes); 
      FetchedImg = Image.FromStream(stream); 
      return FetchedImg; 
     } 
     else 
     { 

      MessageBox.Show("There are no images in the database yet.Please reconnect 
         or add some pictures."); 
      return null; 
     } 

    } 

데이터베이스에 바이너리 데이터로 훈련 세트/이미지를 성공적으로 저장했습니다.이 훈련 세트를 인식에로드 할 때 문제가 발생합니다.

 // Declaring the variables=====trainingImages is where the training sets are 
     // loaded from the database NameLabels and IDLabels are text in the database 
     // and where name and Id of subject 
     //is saved. 
     List<Image<Gray,byte>> trainingImages = new List<Image<Gray,byte>>(); 
     List<string> NameLables= new List<string>(); 
     List<string> IDLables = new List<string>(); 
     int ContTrain, NumNameLabels,NumIDLabels, t; 

    //The training sets from the database are loaded in to the facerecognizer code as 
    //  follows 

    public FaceRecognizer() 
    { 
     InitializeComponent(); 

     try 
     { 
      //Load previous trained and labels for each image from the database Here 
     RefreshDBConnection(); 
     String[] NameLabels = (String[])LocalDataTable.Rows[rowNumber]["StudentName"]; 
     NumNameLabels = Convert.ToInt16(NameLabels[0]); 
     String[] IDLabels = (String[])LocalDataTable.Rows[rowNumber]["StudentID"]; 
     NumIDLabels = Convert.ToInt16(IDLabels[0]); 

     if (NumNameLabels == NumIDLabels) 
     { 
      ContTrain = NumNameLabels; 
      string LoadFaces; 
      // Converting the master image to a bitmap 
      Image imageFromDB; 
      Bitmap imageChangedToBitmap; 
      // Normalizing it to grayscale 
      Image<Gray, Byte> normalizedMasterImage; 

      for (int tf = 1; tf < NumNameLabels + 1; tf++) 
      { 
       imageFromDB = ReadImageFromDB(); 
       //image loaded from the database is converted in to Bitmap and then 
       //convert the bitmap image in to Image<Gray,byte> for input to 
       //EigenObjectRecognizer(,,,) 
      imageChangedToBitmap = new Bitmap(imageFromDB); 
       normalizedMasterImage = new Image<Gray, Byte>(imageChangedToBitmap); 
       LoadFaces = String.Format("face{0}.bmp", tf); 
       trainingImages.Add(normalizedMasterImage); 
       //trainingImages.Add(new Image<Gray, byte>()); 
       NameLables.Add(NameLabels[tf]); 
       IDLables.Add(IDLabels[tf]); 
       rowNumber = rowNumber + 1; 
      } 
     } 
     else 
      MessageBox.Show("There's a conflict between Name labels and id labels"); 
     } 
     catch (Exception e) 
     { 
    MessageBox.Show("Nothing in the database, please add at least a 
       face.Train the database","Triained faces load",MessageBoxButtons.OK, 
       MessageBoxIcon.Exclamation); 
     } 

    } 

데이터베이스에 얼굴이 저장되어 있어도 양식이로드 될 때만 메시지가 캐치에 수신됩니다. 나는 EigenObjectRecognizer를 사용했고 필요한 경우 코드를 게시 할 것이다.

+1

당신은 다른 최근의 질문 [여기] (http://stackoverflow.com/questions/16453792/emgucv-face-recognition-object-reference-not-set-exception-when-using-을 확인해야합니다 trai). 둘이 서로 도울 수 있습니다. –

+0

나는 비슷한 질문을 한 사람에게 연락 할 수 없었다. 그의 이메일이나 뭔가를 얻을 수 있다는 가능성이있다. – Sisay

+0

@Sisay EigenObjectRecognizer 코드를 게시 할 수 있습니까? 나는 같은 일을하려고 노력하고있다. – ccs

답변

0

얼굴을 로딩 할 때 face1, face2, face3 등으로 저장하지 않았습니다. 따라서로드 할 수 없습니다.

LoadFaces = String.Format("face{0}.bmp", tf);