您的位置:首页 > 运维架构

opencv定时器

2015-09-28 10:48 507 查看
测量代码运行时间,精度为us

参考:opencv中测量运行时间的函数

TickMeter类

官方说明文档:http://fossies.org/dox/opencv-3.0.0/classTickMeter.html

(并没有加入opencv的体系,需要引用samples\gpu下的tick_meter.hpp)

用法:创建对象,在开始时调用start();结束时调用stop(),然后如果需要以us为单位的运行时间就调用getTimeMicro(),以ms为单位的就调用getTimeMilli(),以s为单位的是getTimeSec()……先暂停一下,经过实测,发现代码竟然是错误的!

tick_meter.hpp里面的秒、毫秒、微妙计时函数有误!应该修改为

double TickMeter::getTimeSec() const { return (double)getTimeTicks()/cv::getTickFrequency(); }
double TickMeter::getTimeMilli() const { return getTimeSec()*1e3; }
double TickMeter::getTimeMicro() const { return getTimeMilli()*1e3; }
因为(double)getTimeTicks()/cv::getTickFrequency()计算获得的时间是以秒为单位的!没想到官方的代码也会出错啊,而且这个TickMeter类写得也不规范,不建议使用!

TickMeter对象的计时是累积的,如果要分段计时的话,获取运行时间之后,下一次调用start()之前需要调用reset()将计时归零,否则获得的时间是累积运行时间;也可以记录每次的计时结果,与上一次相减。

该类是对getTickCount函数的封装,另外,opencv还有一个更加精确的定时函数getCPUTickCount

实例:

TickMeter tm;
tm.start();
int col=temp.cols, row = temp.rows;
if (temp.isContinuous())
{
col*=row;
row =1;
}
for (i=0; i<row; ++i)
{
const float *pt = temp.ptr<float>(i);
for (j=0; j<col;++j)
{
float mm=pt[3*j];
mm = mm/(float)20.6;
}
}
tm.stop();
cout<<"count="<<tm.getCounter()<<",process time="<<tm.getTimeMilli()<<endl;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: