我正在用C#编程(WindowsForm)。我想使用EmguCV(3.1)来捕获.avi文件。当我加载文件时,我看到了这个例外:
System.Drawing.dll中出现未处理的“System.AccessViolationException”类型异常
附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
在此异常之后,我看到了这个窗口:
以下是加载文件的代码:
private void LoadVideoFromFile()
{
OpenFileDialog d = new OpenFileDialog();
d.ShowDialog();
_capture = new Emgu.CV.Capture(d.FileName);
_capture.ImageGrabbed += ProcessFrame;
}
这是我显示avi文件的代码:
private void ProcessFrame(object sender, EventArgs arg)
{
Action a = () =>
{
UMat captured = new UMat();
Boolean cap = _capture.Retrieve(captured);
pictureBox1.Image = captured.Bitmap;
};
pictureBox1.Invoke(a);
}
答案 0 :(得分:0)
您正在使用使用OpenCL的UMat(如果可用)。大部分时间我碰到这样的事情是因为我忘了为x64编译。试试看,看看是否有帮助。
答案 1 :(得分:0)
行。我把一个小程序汇总在一起,看看发生了什么。请注意,我不是一个WinForms有点猫。我正在使用EmguCV v3.1 x64,为x64编译并使用.NET 4.6.1`公共部分类Form1:表单 { VideoCapture _capture; bool run = true; 公共Form1() { 的InitializeComponent(); }
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog d = new OpenFileDialog();
d.ShowDialog();
tbxFileName.Text = d.FileName;
tbxFileName.Refresh();
_capture = new Emgu.CV.VideoCapture(d.FileName);
_capture.ImageGrabbed += ProcessFrame;
double fps = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);
double frameCount = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount);
progressBar1.Maximum = 100;
progressBar1.Value = 0;
progressBar1.Step = 1;
int currentFrame = 1;
while(run)
{
if (!_capture.Grab())
run = false;
progressBar1.Value = Convert.ToInt32((++currentFrame / frameCount) * 100);
Thread.Sleep(Convert.ToInt32(1000.0 / fps));
Application.DoEvents();
}
}
private void ProcessFrame(object sender, EventArgs arg)
{
Action a = () =>
{
UMat captured = new UMat();
Boolean cap = _capture.Retrieve(captured);
pictureBox1.Image = captured.Bitmap;
pictureBox1.Refresh();
};
pictureBox1.Invoke(a);
}
private void button2_Click(object sender, EventArgs e)
{
run = false;
}
}
` 我收到的唯一错误是当我忘记将cvextern.dll及其他家属复制到bin文件夹时。
希望这有帮助。