0

这是我的相关代码:

在表单的加载方法中:

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,所以我也不明白这里发生了什么?

4

1 回答 1

1

尝试你的 while 循环 DoEvents 调用

while ((count = (int)Math.Floor(stopwatch.ElapsedMilliseconds/(double)1000)) < finalTime) 
{ 
    currentFrame = getFrame(); 
    ib.Image = currentFrame; 
Application.DoEvents();               
    Measurement currentMeasurement = new Measurement(name, currentFrame); 
    measurements.add(currentMeasurement); 
} 
于 2012-07-28T17:48:34.730 回答