2017-09-11 22 views
0

私は顔認識のために4台のカメラを使用して出席システムを作成しています。私はC#でEmgu CV 3.0を使用しています。さて、4つのイメージボックスで構成される出席フォームでは、アプリケーションが突然停止し、メインフォームに戻り、出席フォームを参照するボタンにエラーが表示されます。エラーは次のとおりです。Visual Studio C#保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが壊れていることを示しています。

保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。ここで

は、エラーが発生したコードです:

private void btn_attendance_Click(object sender, EventArgs e) 
    { 
     attendance attendance = new attendance(); 
     attendance.ShowDialog(); 
    } 

をここで認識部なしの出席フォームのコードは次のとおりです。

public partial class attendance : Form 
{ 
    private Capture cam1, cam2, cam3, cam4; 
    private CascadeClassifier _cascadeClassifier; 
    private RecognizerEngine _recognizerEngine; 
    private String _trainerDataPath = "\\traineddata_v2"; 
    private readonly String dbpath = "Server=localhost;Database=faculty_attendance_system;Uid=root;Pwd=root;"; 
    MySqlConnection conn; 

    public attendance() 
    { 
     InitializeComponent(); 
     conn = new MySqlConnection("Server=localhost;Database=faculty_attendance_system;Uid=root;Pwd=root;"); 
    } 

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

    private void attendance_Load(object sender, EventArgs e) 
    { 
     time_now.Start(); 
     lbl_date.Text = DateTime.Now.ToString(""); 
     _recognizerEngine = new RecognizerEngine(dbpath, _trainerDataPath); 

     _cascadeClassifier = new CascadeClassifier(Application.StartupPath + "/haarcascade_frontalface_default.xml"); 
     cam1 = new Capture(0); 
     cam2 = new Capture(1); 
     cam3 = new Capture(3); 
     cam4 = new Capture(4); 

     Application.Idle += new EventHandler(ProcessFrame); 
    } 

    private void ProcessFrame(Object sender, EventArgs args) 
    { 
     Image<Bgr, byte> nextFrame_cam1 = cam1.QueryFrame().ToImage<Bgr, Byte>(); 
     Image<Bgr, byte> nextFrame_cam2 = cam2.QueryFrame().ToImage<Bgr, Byte>(); 
     Image<Bgr, byte> nextFrame_cam3 = cam3.QueryFrame().ToImage<Bgr, Byte>(); 
     Image<Bgr, byte> nextFrame_cam4 = cam4.QueryFrame().ToImage<Bgr, Byte>(); 

     using (nextFrame_cam1) 
     { 
      if (nextFrame_cam1 != null) 
      { 
       Image<Gray, byte> grayframe = nextFrame_cam1.Convert<Gray, byte>(); 
       var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.5, 10, Size.Empty, Size.Empty); 
       foreach (var face in faces) 
       { 
        nextFrame_cam1.Draw(face, new Bgr(Color.Green), 3); 
        var predictedUserId = _recognizerEngine.RecognizeUser(new Image<Gray, byte>(nextFrame_cam1.Bitmap)); 
       } 
       imageBox1.Image = nextFrame_cam1; 
      } 
     } 

     using (nextFrame_cam2) 
     { 
      if (nextFrame_cam2!= null) 
      { 
       Image<Gray, byte> grayframe = nextFrame_cam2.Convert<Gray, byte>(); 
       var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.5, 10, Size.Empty, Size.Empty); 
       foreach (var face in faces) 
       { 
        nextFrame_cam2.Draw(face, new Bgr(Color.Green), 3); 
        var predictedUserId = _recognizerEngine.RecognizeUser(new Image<Gray, byte>(nextFrame_cam2.Bitmap)); 
       } 
       imageBox2.Image = nextFrame_cam2; 
      } 
     } 


     using (nextFrame_cam3) 
     { 
      if (nextFrame_cam3!= null) 
      { 
       Image<Gray, byte> grayframe = nextFrame_cam3.Convert<Gray, byte>(); 
       var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.5, 10, Size.Empty, Size.Empty); 
       foreach (var face in faces) 
       { 
        nextFrame_cam3.Draw(face, new Bgr(Color.Green), 3); 
        var predictedUserId = _recognizerEngine.RecognizeUser(new Image<Gray, byte>(nextFrame_cam3.Bitmap)); 
       } 
       imageBox3.Image = nextFrame_cam3; 
      } 
     } 

     using (nextFrame_cam4) 
     { 
      if (nextFrame_cam4!= null) 
      { 
       Image<Gray, byte> grayframe = nextFrame_cam4.Convert<Gray, byte>(); 
       var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.5, 10, Size.Empty, Size.Empty); 
       foreach (var face in faces) 
       { 
        nextFrame_cam4.Draw(face, new Bgr(Color.Green), 3); 
        var predictedUserId = _recognizerEngine.RecognizeUser(new Image<Gray, byte>(nextFrame_cam4.Bitmap)); 
       } 
       imageBox4.Image = nextFrame_cam4; 
      } 
     } 
    } 
} 
+1

したがって、デバッガを使用してコードをステップ実行し、問題の実際の位置を特定します。私たちはあなたのためにそれをすることはできません。私たちはすべてのコードとプロジェクトのファイルと参照を持っているわけではありません。 –

答えて

1

Plzをメモリリークが何であるかを知るためにこの記事を読んで。 http://www.dotnetfunda.com/articles/show/625/best-practices-no-5-detecting-net-application-memory-leaks

エラーは、クラスの多数のインスタンスまたは関数の再帰呼び出しを作成していることを示しています。 Using()を使用してEmguのオブジェクトを作成し、コードが終了するとすぐにマネージメモリまたはアンマネージメモリが破棄されるようにします。

public partial class attendance : Form 
{ 
    private Capture cam1, cam2, cam3, cam4; 
    private CascadeClassifier _cascadeClassifier; 
    private RecognizerEngine _recognizerEngine; 
    private String _trainerDataPath = "\\traineddata_v2"; 
    private readonly String dbpath = "Server=localhost;Database=faculty_attendance_system;Uid=root;Pwd=root;"; 
    MySqlConnection conn; 

    public attendance() 
    { 
     InitializeComponent(); 
     conn = new MySqlConnection("Server=localhost;Database=faculty_attendance_system;Uid=root;Pwd=root;"); 
    } 

    private void btn_home_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 
    private void attendance_Load(object sender, EventArgs e) 
    { 
     time_now.Start(); 
     lbl_date.Text = DateTime.Now.ToString(""); 
     _recognizerEngine = new RecognizerEngine(dbpath, _trainerDataPath); 
     _cascadeClassifier = new CascadeClassifier(Application.StartupPath + "/haarcascade_frontalface_default.xml"); 
     cam1 = new Capture(0); 
     cam2 = new Capture(1); 
     cam3 = new Capture(3); 
     cam4 = new Capture(4); 
     Application.Idle += new EventHandler(ProcessFrame); 
    } 
    private void ProcessFrame(Object sender, EventArgs args) 
    { 
     using (Image<Bgr, byte> nextFrame_cam1 = cam1.QueryFrame().ToImage<Bgr, Byte>()) 
     { 
      if (nextFrame_cam1 != null) 
      { 
       Image<Gray, byte> grayframe = nextFrame_cam1.Convert<Gray, byte>(); 
       var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.5, 10, Size.Empty, Size.Empty); 
       foreach (var face in faces) 
       { 
        nextFrame_cam1.Draw(face, new Bgr(Color.Green), 3); 
        var predictedUserId = _recognizerEngine.RecognizeUser(new Image<Gray, byte>(nextFrame_cam1.Bitmap)); 
       } 
       imageBox1.Image = nextFrame_cam1; 
      } 
     } 

     using (Image<Bgr, byte> nextFrame_cam2 = cam2.QueryFrame().ToImage<Bgr, Byte>()) 
     { 
      if (nextFrame_cam2 != null) 
      { 
       Image<Gray, byte> grayframe = nextFrame_cam2.Convert<Gray, byte>(); 
       var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.5, 10, Size.Empty, Size.Empty); 
       foreach (var face in faces) 
       { 
        nextFrame_cam2.Draw(face, new Bgr(Color.Green), 3); 
        var predictedUserId = _recognizerEngine.RecognizeUser(new Image<Gray, byte>(nextFrame_cam2.Bitmap)); 
       } 
       imageBox2.Image = nextFrame_cam2; 
      } 
     } 


     using (Image<Bgr, byte> nextFrame_cam3 = cam3.QueryFrame().ToImage<Bgr, Byte>()) 
     { 
      if (nextFrame_cam3 != null) 
      { 
       Image<Gray, byte> grayframe = nextFrame_cam3.Convert<Gray, byte>(); 
       var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.5, 10, Size.Empty, Size.Empty); 
       foreach (var face in faces) 
       { 
        nextFrame_cam3.Draw(face, new Bgr(Color.Green), 3); 
        var predictedUserId = _recognizerEngine.RecognizeUser(new Image<Gray, byte>(nextFrame_cam3.Bitmap)); 
       } 
       imageBox3.Image = nextFrame_cam3; 
      } 
     } 

     using (Image<Bgr, byte> nextFrame_cam4 = cam4.QueryFrame().ToImage<Bgr, Byte>()) 
     { 
      if (nextFrame_cam4 != null) 
      { 
       Image<Gray, byte> grayframe = nextFrame_cam4.Convert<Gray, byte>(); 
       var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.5, 10, Size.Empty, Size.Empty); 
       foreach (var face in faces) 
       { 
        nextFrame_cam4.Draw(face, new Bgr(Color.Green), 3); 
        var predictedUserId = _recognizerEngine.RecognizeUser(new Image<Gray, byte>(nextFrame_cam4.Bitmap)); 
       } 
       imageBox4.Image = nextFrame_cam4; 
      } 
     } 
    } 
} 

Plzを顔recongnizationためEMGU.CVで動作する標準的な方法については、本書をfowllow。 http://www.emgu.com/wiki/index.php/Face_detection

+0

ようこそ。可能であれば、あなたのリンクから最も重要な部分を引用するのが最善です(リンクを参考にしてください)。そうすれば、あなたの答えは今後数年で時代遅れになることはありません。おかげで –

+0

ありがとう@LonelyNeuron – habib

関連する問題