C# - Emgu Cv - 面部识别 - 加载训练集的面孔保存到Access数据库作为二进制到面部识别的EigenObjectRecognizer [英] C# - Emgu Cv - Face Recognition- Loading training sets of Faces saved to Access database as a binary in to EigenObjectRecognizer for Face recognition

查看:333
本文介绍了C# - Emgu Cv - 面部识别 - 加载训练集的面孔保存到Access数据库作为二进制到面部识别的EigenObjectRecognizer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从Ms Access数据库加载训练集到执行面部识别的主要表单很难。我将带有他们的名字和ID的训练集保存到数据库中作为具有OLE对象格式的二进制数据。我用来更改,保存和读取数据库和训练集中的数据的方法是

I was having a hard time loading training set from Ms Access database in to the main form that does the Face Recognition. I saved the training sets with their names and ID in to the database as a binary data with an OLE Object format.The method i used to change, save and read the data from the database and in to the training sets is

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;
            }
        }
    }

将转换后的字节数据存储到数据库中的方法如下:

The method that i use to store the converted byte data to the database is the following:

   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();
        }
      }

我使用的读取此二进制数据的方法是如下:

The method that i use to Read this binary data is as follows:

    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;
        }

    }

我已成功保存训练集/ images作为数据库中的二进制数据。问题是当我加载这些训练集用于Recognition。

I have successfully saved the training sets/images as a binary data in to the database.The problem is when i load these training sets for Recognition.

        // 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);
        }

    }

即使数据库中保存了面,表单加载时的catch。我已经使用了EigenObjectRecognizer,如果必要,我会发布代码。

I am only getting the message in the catch when the the form loads even if there are faces saved in the database. I have used EigenObjectRecognizer and i will post the code if necessary.

推荐答案

在加载面部分,你没有保存所以你不能加载使用;

at the part of loading face, you did not save by face1, face2, face3 etc. So you can not load using;

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

这篇关于C# - Emgu Cv - 面部识别 - 加载训练集的面孔保存到Access数据库作为二进制到面部识别的EigenObjectRecognizer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆