2012-08-15 1 views
1
  1. J'utilise luxand Face SDK pour développer une application de reconnaissance faciale à l'aide de Visual Studio. J'essaie de modifier un exemple d'application. Dans l'application, les échantillons sont conservés dans la mémoire de l'ordinateur, mais j'essaie de l'écrire dans un fichier et de le lire plus tard. L'extrait de code est donné ci-dessous.Erreur de lecture C#

  2. L'application fonctionne correctement et enregistre le fichier. Mais quand il essaie de lire le fichier l'application cesse de fonctionner et j'obtiens l'erreur "Une exception non gérée de type" System.NullReferenceException "s'est produite dans LiveRecognition_VS2008.exe Information supplémentaire: Référence d'objet non définie à une instance d'un objet" et le cette partie du code est mis en évidence "br1.Read (t1.templateData, 0, t1.templateData.Length)"

  3. S'il vous plaît me guider ce qui est l'erreur. Je lis le fichier mal?

 
     struct FaceTemplate { // single template 
       public byte [] templateData; 
      } 
      List faceTemplates; // set of face templates (we store 10) 

      String cameraName; 
      bool needClose = false; 
      string userName; 

      // WinAPI procedure to release HBITMAP handles returned by FSDKCam.GrabFrame 
      [DllImport("gdi32.dll")] 
      static extern bool DeleteObject(IntPtr hObject); 

      public Form1() 
      { 
       InitializeComponent(); 
      } 

      private void Form1_Load(object sender, EventArgs e) 
      { 

       if (FSDK.FSDKE_OK != FSDK.ActivateLibrary("# snip serial key #")) 
       { 
        MessageBox.Show("Please run the License Key Wizard (Start - Luxand - FaceSDK - License Key Wizard)", "Error activating FaceSDK", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        Application.Exit(); 
       } 

       FSDK.InitializeLibrary(); 
       FSDKCam.InitializeCapturing(); 

       string [] cameraList; 
       int count; 
       FSDKCam.GetCameraList(out cameraList, out count); 

       if (0 == count) { 
        MessageBox.Show("Please attach a camera", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        Application.Exit(); 
       } 

       FSDKCam.VideoFormatInfo [] formatList; 
       FSDKCam.GetVideoFormatList(ref cameraList[0], out formatList, out count); 
       pictureBox1.Width = formatList[0].Width; 
       pictureBox1.Height = formatList[0].Height; 
       this.Width = formatList[0].Width + 48; 
       this.Height = formatList[0].Height + 116; 

       cameraName = cameraList[0]; 
      } 

      private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
      { 
       needClose = true; 
      } 

      private void button1_Click(object sender, EventArgs e) 
      { 
       this.button1.Enabled = false; 
       int cameraHandle = 0; 

       int r = FSDKCam.OpenVideoCamera(ref cameraName, ref cameraHandle); 
       if (r != FSDK.FSDKE_OK) 
       { 
        MessageBox.Show("Error opening the first camera", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        Application.Exit(); 
       } 
       btnRemember.Enabled = true; 

       // set realtime face detection parameters 
       FSDK.SetFaceDetectionParameters(false, false, 100); 
       FSDK.SetFaceDetectionThreshold(3); 

       // list where we store face templates 
       faceTemplates = new List(); 

       while (!needClose) 
       { 
        Int32 imageHandle = 0; 
        if (FSDK.FSDKE_OK != FSDKCam.GrabFrame(cameraHandle, ref imageHandle)) // grab the current frame from the camera 
        { 
         Application.DoEvents(); 
         continue; 
        } 

        FSDK.CImage image = new FSDK.CImage(imageHandle); 

        Image frameImage = image.ToCLRImage(); 
        Graphics gr = Graphics.FromImage(frameImage); 

        FSDK.TFacePosition facePosition = image.DetectFace(); 
        // if a face is detected, we can recognize it 
        if (facePosition.w != 0) 
        { 
         gr.DrawRectangle(Pens.LightGreen, facePosition.xc - facePosition.w/2, facePosition.yc - facePosition.w/2, 
          facePosition.w, facePosition.w); 

         // create a new face template 
         FaceTemplate template = new FaceTemplate(); 

         if (programState == ProgramState.psRemember || programState == ProgramState.psRecognize) 
          template.templateData = image.GetFaceTemplateInRegion(ref facePosition); 


         switch (programState) 
         { 
          case ProgramState.psNormal: // normal state - do nothing 
           break; 

          case ProgramState.psRemember: // Remember Me state - store facial templates 
           faceTemplates.Add(template); 
           label1.Text = "Templates stored: " + faceTemplates.Count.ToString(); 

           if (faceTemplates.Count > 0) 
           { 
            // get the user name 
            InputName inputName = new InputName(); 
            inputName.ShowDialog(); 
            userName = inputName.userName; 

            FileStream fs = File.Open(userName + ".bin", FileMode.Create); 
            BinaryWriter bw = new BinaryWriter(fs); //Opens a binary writer (writes to file stream) 
            bw.Write(template.templateData, 0, template.templateData.Length); 
            bw.Close(); 
            fs.Close(); 
            programState = ProgramState.psRecognize; 
           } 
           break; 

          case ProgramState.psRecognize: // recognize the user 
           bool match = false; 

           /* 

           foreach (FaceTemplate t in faceTemplates) 
           { 
            float similarity = 0.0f; 
            FaceTemplate t1 = t; 
            FSDK.MatchFaces(ref template.templateData, ref t1.templateData, ref similarity); 
            float threshold = 0.0f; 
            FSDK.GetMatchingThresholdAtFAR(0.01f, ref threshold); // set FAR to 1% 
            if (similarity > threshold) 
            { 
             match = true; 
             break; 
            } 
           } 

           */ 

           FaceTemplate t1 = new FaceTemplate(); 
           FileStream fs1 = File.Open(userName + ".bin", FileMode.Open,FileAccess.Read); 
           BinaryReader br1 = new BinaryReader(fs1); 

           br1.Read(t1.templateData, 0, t1.templateData.Length); 
           float similarity = 0.0f; 
           FSDK.MatchFaces(ref template.templateData, ref t1.templateData, ref similarity); 
           float threshold = 0.0f; 
           FSDK.GetMatchingThresholdAtFAR(0.01f, ref threshold); // set FAR to 1% 
           if (similarity > threshold) 
           { 
            match = true; 
           } 


           if (match) 
           { 
            StringFormat format = new StringFormat(); 
            format.Alignment = StringAlignment.Center; 

            gr.DrawString(userName, new System.Drawing.Font("Arial", 16), 
             new System.Drawing.SolidBrush(System.Drawing.Color.LightGreen), 
             facePosition.xc, facePosition.yc + facePosition.w * 0.55f, format); 
           } 
           break; 
         } 
        } 

        // display current frame 
        pictureBox1.Image = frameImage; 

        GC.Collect(); // collect the garbage after the deletion 

        // make UI controls accessible 
        Application.DoEvents(); 
       } 

       FSDKCam.CloseVideoCamera(cameraHandle); 
       FSDKCam.FinalizeCapturing();    
      } 

      private void btnRemember_Click(object sender, EventArgs e) 
      { 
       faceTemplates.Clear(); 
       programState = ProgramState.psRemember; 
       label1.Text = "Look at the camera"; 
      } 
     } 
    } 

+1

Nulle part dans le code ne Je vois 'br1.Read' et cette erreur est tellement générale qu'il est difficile de vous aider de quelque façon que ce soit. – JonH

+2

est-ce une clé de série dans votre code posté? – Mizipzor

+0

@DavidB faites de ce commentaire une réponse et vous obtiendrez un upvote. – Mizipzor

Répondre

2

t1.templateData est null. Lors de l'écriture, vous devez d'abord stocker la longueur dans le fichier. Puis en lisant, lisez la taille, créez le tableau, puis lisez son contenu.

Essayez quelque chose comme ceci:

using (BinaryWriter bw = new BinaryWriter(fs)) 
{ 
    bw.Write(template.templateData.Length); 
    bw.Write(template.templateData, 0, template.templateData.Length); 
} 



using(BinaryReader br1 = new BinaryReader(fs1)) 
{ 
    int length = br1.ReadInt32(); 
    t1.templateData = new byte[length]; 
    br1.Read(t1.templateData, 0, t1.templateData.Length); 
} 
+0

Mais j'écris dans le fichier en utilisant également les mêmes arguments – user1138880

+0

peut donner un exemple s'il vous plaît – user1138880

+0

Merci cela a fonctionné !! – user1138880

1

Vous avez un null référence- aller à br1.Read(t1.templateData, 0, t1.templateData.Length); et trouver que l'on est pas défini (je parie sur t1.templateData)

+0

Oui, aucune donnée n'est lue dans t1.templateData – user1138880

+0

@ user1138880 Si vos 'templateData' ou' templateData.Length' ne sont pas définis lors de la création de l'objet 't1', cela vous donnera cette erreur. Cela signifie essentiellement que vous ne pointez rien et que le programme ne peut pas travailler sur rien! –