我有一个项目,当用户在登录表单中错误登录3次时,网络摄像头会自动开始捕捉。它成功地将图像保存在数据库中,但有一个错误是Object Reference not set to an instance of an object。我知道这个问题有很多问题和答案,但我还是解决不了。另一个问题是,当我只是从webcam窗体调试时,它运行得很完美,没有错误信息,但当我从登录窗体调试时,就会出现错误。另一个问题是,它没有显示错误的行,但我确信它来自于这里的某个地方。
private void webcam_Load(object sender, EventArgs e)
{
if ((imagecapture == null))
{
try
{
imagecapture = new Emgu.CV.VideoCapture();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Application.Idle += new EventHandler(loadimage);
}
这是loadimage()
public void loadimage(object sender, EventArgs e)
{
try
{
Emgu.CV.Mat imageviewer = this.imagecapture.QueryFrame();
pictureBox1.Image = imageviewer.Bitmap;
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] picture = ms.ToArray();
connection.Open();
DateTime dtime = DateTime.Now;
string qry = "INSERT INTO WebcamPhoto (ImageData,DateAndTime) VALUES(@ImageData,@dt)";
//Initialize SqlCommand object for insert.
SqlCommand cmd = new SqlCommand(qry, connection);
cmd.Parameters.AddWithValue("@ImageData", picture);
cmd.Parameters.AddWithValue("@dt", dtime);
cmd.ExecuteNonQuery();
connection.Close();
imagecapture.Dispose();
//Close form and return to list or images.
this.Close();
}
catch (NullReferenceException ex)
{
MessageBox.Show(ex.Message);
}
}
我试着把回车,错误信息消失了,但即使摄像头在工作,图像也没有保存在数据库中。
private void webcam_Load(object sender, EventArgs e)
{
if ((imagecapture == null))
{
try
{
imagecapture = new Emgu.CV.VideoCapture();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return;
}
Application.Idle += new EventHandler(loadimage);
}
好吧,经过几天的努力,我终于找到了答案。怎么做呢?我试着逐行改变代码的写法,每改一次代码就测试一次,终于找到了罪魁祸首。那么罪魁祸首就是。
public void loadimage(object sender, EventArgs e)
{
//my other code.....
imagecapture.Dispose(); <<<----here
}
所以我把它改成
private void ReleaseData()
{
if (imagecapture !=null)
{
imagecapture.Dispose();
}
}
现在问题解决了 :)