这是我的相关代码:
在表单的加载方法中:
Application.Idle += new EventHandler(delegate(object s, EventArgs ea)
{
if (!recording)
{
currentFrame = getFrame();
ib.Image = currentFrame;
}
else
{
ib.Image = recFrame;
}
});
按下按钮(ib 是表单上的 ImageBox):
Measurements measurements = new Measurements();
String name = txtSampleName.Text;
ib.Image = recFrame;
stopwatch.Start();
recording = true;
while ((count = (int)Math.Floor(stopwatch.ElapsedMilliseconds/(double)1000)) < finalTime)
{
currentFrame = getFrame();
Measurement currentMeasurement = new Measurement(name, currentFrame);
measurements.add(currentMeasurement);
}
recording = false;
stopwatch.Stop();
measurements.write(txtDirectory.Text);
问题是框架实际上并没有更新。currentFrame 采用循环开始之前帧的值。recFrame 在 ib.Image 中不可见 - ib 只是在循环期间挂起 - 并没有像应有的那样填充 recFrame)。currentMeasurement 按原样添加到测量列表中,但其中的帧不是来自相机的当前帧。下面是来自 getFrame() 的代码摘要,它要么不返回当前时间来自网络摄像头的内容,要么是并且 currentFrame 无论如何都采用其旧值:
private Image<Bgr, Byte> getFrame()
{
// get the frame
Image<Bgr, Byte> frame = capture.QueryFrame();
// draw some stuff on top of the frame
// ...
// return
return frame;
}
我是否需要添加某种延迟来等待某事完成?我试过放入一个 Thread.Sleep 并没有任何帮助。我不明白问题是什么,所以一直无法寻找一个明智的解决方案。当我稍后将测量中的帧导出到 AVI 文件时,所有帧在循环开始之前都具有 currentFrame 的值,并且不会更改。
有任何想法吗?
非常感谢,
弗罗斯科伊。
编辑:在 currentMeasurement = new Measurement(name,currentFrame) 行上使用 currentFrame.Copy() 意味着当前捕获的帧实际上已放入列表中,然后写入 AVI 文件。我不明白为什么?另外,在ib中仍然没有显示recFrame,所以我也不明白这里发生了什么?