Visual Studio C#试图读取或写入受保护的内存。这通常表示其他内存已损坏

问题描述:

我正在使用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

因此,使用调试器,并通过代码来找出问题的实际位置。我们不能为你做这件事。我们没有全部的代码和项目文件和引用。 –

PLZ看到这篇文章才知道什么是内存泄漏。 http://www.dotnetfunda.com/articles/show/625/best-practices-no-5-detecting-net-application-memory-leaks

您的错误表明您正在创建一个类的多个实例或函数的任何递归调用。 使用使用()创建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 fowllow这个文件标准的方式与EMGU.CV一起工作,用于面部识别。 http://www.emgu.com/wiki/index.php/Face_detection

+0

欢迎来到SO。如果可能的话,最好引用链接中最重要的部分(同时保留链接作为参考)。这样你的答案在未来几年不会过时。谢谢 –

+0

谢谢@LonelyNeuron – habib