opencv中测量运行时间的函数

原文转载自:http://blog.csdn.net/ljbkiss/article/details/7378392
  最开始的C接口中的是 cvGetTickCount()和 cvGetTickFrequency(),在程序段的开始和结束时两次使用cvGetTickCount(),然后将两次的差除以cvGetTickFrequency()后就可以获得程序段的以微秒us为单位的运行时间,不是很精确但是一般足够了。
  C++接口中还将上面的函数封装为了一个类TickMeter,方便使用,下面是关于TickMeter的声明和实现的源码:
  

 //#include<contrib/contrib.hpp>
 class CV_EXPORTS TickMeter  
{  
public:  
    TickMeter();  
    void start();  
    void stop();  

    int64 getTimeTicks() const;  
    double getTimeMicro() const;  
    double getTimeMilli() const;  
    double getTimeSec()   const;  
    int64 getCounter() const;  

    void reset();  
private:  
    int64 counter;  
    int64 sumTime;  
    int64 startTime;  
};  
CV_EXPORTS std::ostream& operator<<(std::ostream& out, const TickMeter& tm);  

//Spinimages.cpp      
cv::TickMeter::TickMeter() { reset(); }  
int64 cv::TickMeter::getTimeTicks() const { return sumTime; }  
double cv::TickMeter::getTimeMicro() const { return (double)getTimeTicks()/cvGetTickFrequency(); }  
double cv::TickMeter::getTimeMilli() const { return getTimeMicro()*1e-3; }  
double cv::TickMeter::getTimeSec()   const { return getTimeMilli()*1e-3; }      
int64 cv::TickMeter::getCounter() const { return counter; }  
void  cv::TickMeter::reset() {startTime = 0; sumTime = 0; counter = 0; }  

void cv::TickMeter::start(){ startTime = cvGetTickCount(); }  
void cv::TickMeter::stop()  
{  
    int64 time = cvGetTickCount();  
    if ( startTime == 0 )  
        return;  

    ++counter;  

    sumTime += ( time - startTime );  
    startTime = 0;  
}  

std::ostream& cv::operator<<(std::ostream& out, const TickMeter& tm){ return out << tm.getTimeSec() << "sec"; }  

测试实例:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<contrib/contrib.hpp>
using namespace cv;
using namespace std;

int main()
{
    TickMeter tm;
    tm.start();
    Mat img1 = imread("1.jpg");
    namedWindow("img1", CV_WINDOW_NORMAL);
    setWindowProperty("img1", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
    imshow("img1", img1);
    //waitKey(3000);

    tm.stop();
    cout << "count=" << tm.getCounter() << " ,process time=" << tm.getTimeMilli() << endl;
    return 0;
}

  可以看出TickMeter仅仅是将C接口的函数进行了一下封装,不过使用时就方便多了,不用去反复gettickcount然后除以frequency了,只需要在开始时调用start();结束时调用stop(),然后如果需要以us为单位的运行时间就调用getTimeMicro(),以ms为单位的就调用getTimeMilli(),以s为单位的是getTimeSec(),而getTimeTicks()返回运行时间的tickcount,getTimeTicks()返回的是调用stop的次数,同时该类还重载了ostream,可以方便的以s为单位直接输出。
  【NOTE!TickMeter对象的计时是累积的,如果要分段计时的话,获取运行时间之后,下一次调用start()之前需要调用reset()将计时归零,否则获得的时间是累积运行时间】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值