2015-04-22 49 views
0

我已經創建並使用了我的程序中的表單應用程序實例。 但我面臨的問題是下面的形式是不會被創建的。有什麼問題請幫助我?從c#應用程序問題創建窗體實例?

開始調試時生成錯誤信息:

錯誤1「Face_Recognition.frm_faceReg」不包含一個構造 即取0參數

我用來創建代碼的快照的形式的一個實例:

enter image description here

frm_faceReg形式的實際代碼是:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

using Emgu.CV.UI; 
using Emgu.CV; 
using Emgu.CV.Structure; 
using Emgu.CV.CvEnum; 

using System.IO; 
using System.Drawing.Imaging; 
using System.Xml; 
using System.Threading; 


namespace Face_Recognition 
{ 
    public partial class frm_faceReg : Form 
    { 
     #region Variables 
     //Camera specific 
     Capture grabber; 

     //Images for finding face 
     Image<Bgr, Byte> currentFrame; 
     Image<Gray, byte> result = null; 
     Image<Gray, byte> gray_frame = null; 

     //Classifier 
     CascadeClassifier Face; 

     //For aquiring 10 images in a row 
     List<Image<Gray, byte>> resultImages = new List<Image<Gray, byte>>(); 
     int results_list_pos = 0; 
     int num_faces_to_aquire = 10; 
     bool RECORD = false; 

     //Saving Jpg 
     List<Image<Gray, byte>> ImagestoWrite = new List<Image<Gray, byte>>(); 
     EncoderParameters ENC_Parameters = new EncoderParameters(1); 
     EncoderParameter ENC = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100); 
     ImageCodecInfo Image_Encoder_JPG; 

     //Saving XAML Data file 
     List<string> NamestoWrite = new List<string>(); 
     List<string> NamesforFile = new List<string>(); 
     XmlDocument docu = new XmlDocument(); 

     //Variables 
     frm_faceDec_faceRec Parent; 
     #endregion 

     public frm_faceReg(frm_faceDec_faceRec _Parent) 
     { 
      InitializeComponent(); 
      Parent = _Parent; 
      Face = Parent.Face; 
      //Face = new HaarCascade(Application.StartupPath + "/Cascades/haarcascade_frontalface_alt2.xml"); 
      ENC_Parameters.Param[0] = ENC; 
      Image_Encoder_JPG = GetEncoder(ImageFormat.Jpeg); 
      initialise_capture(); 
     } 

     private void Training_Form_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      stop_capture(); 
      Parent.retrain(); 
      Parent.initialise_capture(); 
     } 

     //Camera Start Stop 
     public void initialise_capture() 
     { 
      grabber = new Capture(); 
      grabber.QueryFrame(); 
      //Initialize the FrameGraber event 
      Application.Idle += new EventHandler(FrameGrabber); 
     } 
     private void stop_capture() 
     { 
      Application.Idle -= new EventHandler(FrameGrabber); 
      if (grabber != null) 
      { 
       grabber.Dispose(); 
      } 
      //Initialize the FrameGraber event 
     } 

     //Process Frame 
     void FrameGrabber(object sender, EventArgs e) 
     { 
      //Get the current frame form capture device 
      currentFrame = grabber.QueryFrame().Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 

      //Convert it to Grayscale 
      if (currentFrame != null) 
      { 
       gray_frame = currentFrame.Convert<Gray, Byte>(); 

       //Face Detector 
       //MCvAvgComp[][] facesDetected = gray_frame.DetectHaarCascade(Face, 1.2, 10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20)); //old method 
       Rectangle[] facesDetected = Face.DetectMultiScale(gray_frame, 1.2, 10, new Size(50, 50), Size.Empty); 

       //Action for each element detected 
       for(int i = 0; i< facesDetected.Length; i++)// (Rectangle face_found in facesDetected) 
       { 
        //This will focus in on the face from the haar results its not perfect but it will remove a majoriy 
        //of the background noise 
        facesDetected[i].X += (int)(facesDetected[i].Height * 0.15); 
        facesDetected[i].Y += (int)(facesDetected[i].Width * 0.22); 
        facesDetected[i].Height -= (int)(facesDetected[i].Height * 0.3); 
        facesDetected[i].Width -= (int)(facesDetected[i].Width * 0.35); 

        result = currentFrame.Copy(facesDetected[i]).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 
        result._EqualizeHist(); 
        face_PICBX.Image = result.ToBitmap(); 
        //draw the face detected in the 0th (gray) channel with blue color 
        currentFrame.Draw(facesDetected[i], new Bgr(Color.Red), 2); 

       } 
       if (RECORD && facesDetected.Length > 0 && resultImages.Count < num_faces_to_aquire) 
       { 
        resultImages.Add(result); 
        count_lbl.Text = "Count: " + resultImages.Count.ToString(); 
        if (resultImages.Count == num_faces_to_aquire) 
        { 
         ADD_BTN.Enabled = true; 
         NEXT_BTN.Visible = true; 
         PREV_btn.Visible = true; 
         count_lbl.Visible = false; 
         Single_btn.Visible = true; 
         ADD_ALL.Visible = true; 
         RECORD = false; 
         Application.Idle -= new EventHandler(FrameGrabber); 
        } 
       } 

       image_PICBX.Image = currentFrame.ToBitmap(); 
      } 
     } 

     //Saving The Data 
     private bool save_training_data(Image face_data) 
     { 
      try 
      { 
       Random rand = new Random(); 
       bool file_create = true; 
       string facename = "face_" + NAME_PERSON.Text + "_" + rand.Next().ToString() + ".jpg"; 
       while (file_create) 
       { 

        if (!File.Exists(Application.StartupPath + "/TrainedFaces/" + facename)) 
        { 
         file_create = false; 
        } 
        else 
        { 
         facename = "face_" + NAME_PERSON.Text + "_" + rand.Next().ToString() + ".jpg"; 
        } 
       } 


       if(Directory.Exists(Application.StartupPath + "/TrainedFaces/")) 
       { 
        face_data.Save(Application.StartupPath + "/TrainedFaces/" + facename, ImageFormat.Jpeg); 
       } 
       else 
       { 
        Directory.CreateDirectory(Application.StartupPath + "/TrainedFaces/"); 
        face_data.Save(Application.StartupPath + "/TrainedFaces/" + facename, ImageFormat.Jpeg); 
       } 
       if (File.Exists(Application.StartupPath + "/TrainedFaces/TrainedLabels.xml")) 
       { 
        //File.AppendAllText(Application.StartupPath + "/TrainedFaces/TrainedLabels.txt", NAME_PERSON.Text + "\n\r"); 
        bool loading = true; 
        while (loading) 
        { 
         try 
         { 
          docu.Load(Application.StartupPath + "/TrainedFaces/TrainedLabels.xml"); 
          loading = false; 
         } 
         catch 
         { 
          docu = null; 
          docu = new XmlDocument(); 
          Thread.Sleep(10); 
         } 
        } 

        //Get the root element 
        XmlElement root = docu.DocumentElement; 

        XmlElement face_D = docu.CreateElement("FACE"); 
        XmlElement name_D = docu.CreateElement("NAME"); 
        XmlElement file_D = docu.CreateElement("FILE"); 

        //Add the values for each nodes 
        //name.Value = textBoxName.Text; 
        //age.InnerText = textBoxAge.Text; 
        //gender.InnerText = textBoxGender.Text; 
        name_D.InnerText = NAME_PERSON.Text; 
        file_D.InnerText = facename; 

        //Construct the Person element 
        //person.Attributes.Append(name); 
        face_D.AppendChild(name_D); 
        face_D.AppendChild(file_D); 

        //Add the New person element to the end of the root element 
        root.AppendChild(face_D); 

        //Save the document 
        docu.Save(Application.StartupPath + "/TrainedFaces/TrainedLabels.xml"); 
        //XmlElement child_element = docu.CreateElement("FACE"); 
        //docu.AppendChild(child_element); 
        //docu.Save("TrainedLabels.xml"); 
       } 
       else 
       { 
        FileStream FS_Face = File.OpenWrite(Application.StartupPath + "/TrainedFaces/TrainedLabels.xml"); 
        using (XmlWriter writer = XmlWriter.Create(FS_Face)) 
        { 
         writer.WriteStartDocument(); 
         writer.WriteStartElement("Faces_For_Training"); 

         writer.WriteStartElement("FACE"); 
         writer.WriteElementString("NAME", NAME_PERSON.Text); 
         writer.WriteElementString("FILE", facename); 
         writer.WriteEndElement(); 

         writer.WriteEndElement(); 
         writer.WriteEndDocument(); 
        } 
        FS_Face.Close(); 
       } 

       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 

     } 
     private ImageCodecInfo GetEncoder(ImageFormat format) 
     { 
      ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 
      foreach (ImageCodecInfo codec in codecs) 
      { 
       if (codec.FormatID == format.Guid) 
       { 
        return codec; 
       } 
      } 
      return null; 
     } 

     //Delete all the old training data by simply deleting the folder 
     private void Delete_Data_BTN_Click(object sender, EventArgs e) 
     { 
      if (Directory.Exists(Application.StartupPath + "/TrainedFaces/")) 
      { 
       Directory.Delete(Application.StartupPath + "/TrainedFaces/", true); 
       Directory.CreateDirectory(Application.StartupPath + "/TrainedFaces/"); 
      } 
     } 

     //Add the image to training data 
     private void ADD_BTN_Click(object sender, EventArgs e) 
     { 
      if (resultImages.Count == num_faces_to_aquire) 
      { 
       if (!save_training_data(face_PICBX.Image)) MessageBox.Show("Error", "Error in saving file info. Training data not saved", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
      else 
      { 
       stop_capture(); 
       if (!save_training_data(face_PICBX.Image)) MessageBox.Show("Error", "Error in saving file info. Training data not saved", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       initialise_capture(); 
      } 
     } 
     private void Single_btn_Click(object sender, EventArgs e) 
     { 
      RECORD = false; 
      resultImages.Clear(); 
      NEXT_BTN.Visible = false; 
      PREV_btn.Visible = false; 
      Application.Idle += new EventHandler(FrameGrabber); 
      Single_btn.Visible = false; 
      count_lbl.Text = "Count: 0"; 
      count_lbl.Visible = true; 
     } 
     //Get 10 image to train 
     private void RECORD_BTN_Click(object sender, EventArgs e) 
     { 
      if (RECORD) 
      { 
       RECORD = false; 
      } 
      else 
      { 
       if (resultImages.Count == 10) 
       { 
        resultImages.Clear(); 
        Application.Idle += new EventHandler(FrameGrabber); 
       } 
       RECORD = true; 
       ADD_BTN.Enabled = false; 
      } 

     } 
     private void NEXT_BTN_Click(object sender, EventArgs e) 
     { 
      if (results_list_pos < resultImages.Count - 1) 
      { 
       face_PICBX.Image = resultImages[results_list_pos].ToBitmap(); 
       results_list_pos++; 
       PREV_btn.Enabled = true; 
      } 
      else 
      { 
       NEXT_BTN.Enabled = false; 
      } 
     } 
     private void PREV_btn_Click(object sender, EventArgs e) 
     { 
      if (results_list_pos > 0) 
      { 
       results_list_pos--; 
       face_PICBX.Image = resultImages[results_list_pos].ToBitmap(); 
       NEXT_BTN.Enabled = true; 
      } 
      else 
      { 
       PREV_btn.Enabled = false; 
      } 
     } 
     private void ADD_ALL_Click(object sender, EventArgs e) 
     { 
      for(int i = 0; i<resultImages.Count;i++) 
      { 
       face_PICBX.Image = resultImages[i].ToBitmap(); 
       if (!save_training_data(face_PICBX.Image)) MessageBox.Show("Error", "Error in saving file info. Training data not saved", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       Thread.Sleep(100); 
      } 
      ADD_ALL.Visible = false; 
      //restart single face detection 
      Single_btn_Click(null, null); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
      this.Dispose(); 
     } 

     private void frm_faceReg_Load(object sender, EventArgs e) 
     { 

     } 

    } 
} 
+1

錯誤對我來說似乎很清楚。看看'Face_Recognition.frm_faceReg'的構造函數,顯然它需要你傳遞一些東西。 –

+0

請包括實際的代碼(而不僅僅是截圖)。另外'frm_faceReg'的代碼很好看。 – ryanyuyu

+0

我發送了代碼。謝謝。 – ensberiyu

回答

1

嗯,很明顯的形式不聲明參數的構造函數 - 就像錯誤消息指出。所有構造函數都希望將參數傳遞給它們,否則構造函數不可訪問*。

檢查frm_faceReg的構造函數以獲取需要傳遞的可能值。

*)例如,如果有工廠方法需要調用,而不是使用帶構造函數的new,但這很少見。


所添加的代碼使很清楚,只有一個定義需要一個參數的構造函數:

public frm_faceReg(frm_faceDec_faceRec _Parent) 

你需要傳遞的frm_faceDec_faceRec一個實例,不管它是什麼。

而作爲一個側面說明:您真的應該閱讀有關C#命名約定...

+0

我提到空構造函數是自動生成的,當沒有其他構造函數定義。 – ryanyuyu

+0

爲什麼?這不會增加問題的解決方案。該錯誤說沒有無參數的構造函數,所以很清楚,只有私有構造函數或者需要參數的公共構造函數。 –

+0

我建議通過手動定義默認構造函數來解決問題的替代方法。這有時候會讓人們失望,因爲它經常是自動生成的。 – ryanyuyu

0

這意味着該對象的構造函數的參數。

frm_faceReg frg = new frm_faceReg(PUT SOME ARGS HERE); 
相關問題