我正在测量C ++中图像处理程序中几个函数的执行时间。特别是,我希望用USB摄像头拍摄帧的实际执行时间。
问题是结果似乎与相机参数不一致:相机最多应该是30 fps,而且我经常得到一个小于33 ms的测量时间来获取一个帧,这是我认为应该预期的价值。例如,我得到了很多12毫秒的间隔,这看起来真的太少了。
以下是代码:
#include <time.h>
#include <sys/time.h>
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
// Handle error
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
int main(){
while (true) {
double previoustime = get_wall_time();
this->camera.readFrame();
double currenttime = get_wall_time();
std::cout << currenttime-previoustime << std::endl;
// Other stuff
// ...
// ...
usleep(3000);
}
}
答案 0 :(得分:2)
正如@Revolver_Ocelot所说,您正在测量从get_wall_time
结束到另一个类似呼叫结束所花费的时间。要修复代码,请执行以下操作:
double currenttime = get_wall_time();
while (true) {
double previoustime = currenttime;
this->camera.readFrame();
...
currentime = get_wall_time();
}
你能发现差异吗?此代码测量每次传递之间的间隔,这是您希望每秒获得帧数。
您可以读取相机的速度与完成新相框的速度不同。您的相机可能以30 FPS录制,您可以以15 FPS或90 FPS读取它,从而对帧流进行二次采样或过采样。
您可以过采样的限制是1 /读取图像并存储它所需的时间。
这就是@Jacob Hull对封锁意味着什么;如果readFrame
只读取最后一帧,则在新帧结束之前它不会阻塞,您将获得与测量结果相同的结果。