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;
}
}
}
}
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
欢迎来到SO。如果可能的话,最好引用链接中最重要的部分(同时保留链接作为参考)。这样你的答案在未来几年不会过时。谢谢 –
谢谢@LonelyNeuron – habib
因此,使用调试器,并通过代码来找出问题的实际位置。我们不能为你做这件事。我们没有全部的代码和项目文件和引用。 –