読者です 読者をやめる 読者になる 読者になる

OpenCVで時間の計測

cv::TickMeter を使いましょう。なんか影の薄いcontribにあります。

cv::TickMeter meter;
meter.start();

// 何かの処理

meter.stop();
std::cout << meter.getTimeMilli() << "ms" << std::endl;

定番は以下のような書き方ですが、卒業しましょう。OpenCVのを使わずQueryPerformanceCounter, timeGetTime等の別の手段を使うにしろ、大抵これと似たようになると思います。TickMeterにより、これよりも見通し良く、何をしているか直感的にわかるコードにできます。

int64 start = cv::getTickCount();

// 何かの処理

int64 end = cv::getTickCount();
double elapsedMsec = (end - start) * 1000 / cv::getTickFrequency();
std::cout << elapsedMsec << "ms" << std::endl;

なお、std::ostreamへの出力のオペレータが定義されているので、直接TickMeterオブジェクトを投げることもできます。"12.345sec" のような形式で、秒数が表示されます。

std::cout << meter << std::endl;

複数回計測

resetしてstartです。

cv::TickMeter meter;
// 1回目
meter.start();
for(int i=0; i<100000; i++)
    cv::Mat m(1, 1, CV_8UC1);
meter.stop();
std::cout << meter << std::endl;

// 2回目
meter.reset();
meter.start();
for(int i=0; i<100000; i++)
    cv::Mat m = cv::Mat::eye(10, 10, CV_32FC1);
meter.stop();
std::cout << meter << std::endl;

.NET FrameworkのSystem.Diagnostics.Stopwatch.Restartメソッド相当のものがあれば満点ですね。

TickMeter の定義

秒、ミリ秒、マイクロ秒が取れます。充分ですね。

namespace cv 
{
    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;
    };
}