2

我目前正在开发一个图像处理应用程序。该应用程序从网络摄像头捕获图像,然后对其进行一些处理。应用程序需要实时响应(理想情况下,处理每个请求的时间 < 50 毫秒)。我一直在对我拥有的代码进行一些计时测试,我发现了一些非常有趣的东西(见下文)。

clearLog();
log("Log cleared");

camera.QueryFrame();
camera.QueryFrame();
log("Camera buffer cleared");

Sensor s = t.val;
log("Sx: " + S.X + " Sy: " + S.Y);

Image<Bgr, Byte> cameraImage = camera.QueryFrame();
log("Camera output acuired for processing");

每次log调用都显示自处理开始以来的时间。这是我的日志输出:

[3 ms]Log cleared
[41 ms]Camera buffer cleared
[41 ms]Sx: 589 Sy: 414
[112 ms]Camera output acuired for processing

时间是使用StopWatchfrom计算的System.Diagonostics。上面显示的时间是累积的。所以 Log Clear 花了 3ms。并且“相机缓冲区已清除”花了(41-3 = 38ms)。

问题 1

我觉得这有点有趣,因为当同一个方法被调用两次时,它会在大约 40 毫秒内执行,而当它下一次被调用时,它会花费更长的时间(大约 70 毫秒)。

分配价值真的不能花那么长时间,对吧?

问题2

此外,上面记录的每个步骤的时间也会不时变化。某些步骤的值有时低至 0 毫秒,有时高达 100 毫秒。尽管大多数数字似乎相对一致。

我想这可能是因为CPU同时被其他进程使用了​​?(如果这是出于其他原因,请告诉我)

有没有办法确保这个函数在运行时获得最高优先级?这样速度测试结果就会一直很低(就时间而言)。

编辑

我更改了代码以从上面删除两个空白查询框,所以现在的代码是:

clearLog();
log("Log cleared");

Sensor s = t.val;
log("Sx: " + S.X + " Sy: " + S.Y);

Image<Bgr, Byte> cameraImage = camera.QueryFrame();
log("Camera output acuired for processing");

现在的计时结果是:

[2 ms]Log cleared
[3 ms]Sx: 589 Sy: 414
[5 ms]Camera output acuired for processing

下一步现在需要更长的时间(有时,下一步会在 20-30 毫秒后跳转,而下一步几乎是瞬间完成的)。我猜这是由于CPU调度。有什么办法可以确保 CPU 在运行此代码时不会被安排做其他事情?

4

2 回答 2

1

可能是相机在您要求时并没有真正“获取帧”,而是一直在这样做。然后,当您向它询问图像数据并且它足够新鲜时,数据会立即返回。但是如果你运气不好并且数据是陈旧的,那么你就可以等待更新的图像采集。如果相机的速度为 25fps,则很可能意味着 50 毫秒的延迟(不仅是实际的光子收集,还有数据传输)。

尝试将相机设置为较低的分辨率(这样可以提高帧率),延迟会下降吗?

于 2010-03-31T22:08:01.117 回答
0

没有来源,几乎不可能说“什么是可能的”。

让计时变得棘手的一件事是秒表是否处于低分辨率模式。编写几个循环只是为了验证您确实可以生成任意测量值(即任意数量的毫秒而没有不适当的粒度)可能是值得的。

您是否尝试过使用分析器?这可能会回答您关于该过程当时还在做什么的问题。

于 2010-03-29T08:40:42.310 回答