2015-04-22 48 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); 
相关问题