Skip to content

OpenCV 3.0でTickMeterを使う

atinfinity edited this page Oct 15, 2016 · 23 revisions

OpenCV 3.0でTickMeterを使う

はじめに

OpenCV 2.4.xでは処理時間を計測するためのcv::TickMeterクラスが用意されていたのですが,OpenCV 3.0からこの機能がなくなってしまいました.ここではOpenCV 3.0でTickMeterを使う方法について紹介します.

注意点

cv::TickMeter class addition #6821がマージされたことでcv::TickMeterが復活したため、OpenCV 3.2以降ではcv::TickMeterが使える見込みです。

使い方

OpenCV 3.0でTickMeterを使う方法は以下の通りです.

  • opencv-3.0.0\samples\gpuにあるtick_meter.hppを自身のプロジェクトにコピーする
  • OpenCV 3.0に同梱されるtick_meter.hppには処理時間の計算方法にバグがあるので修正する(※修正方法は後述)
  • 使用したいソースコードにて,OpenCVヘッダインクルードの後に#include "tick_meter.hpp"としてインクルードする

tick_meter.hppの修正方法

OpenCV 3.0に同梱されるtick_meter.hppは秒,ミリ秒,マイクロ秒の計算方法が誤っているので以下のようにtick_meter.hppを変更する必要があります.

オリジナルのtick_meter.hpp(※バグあり)

double TickMeter::getTimeMicro() const { return (double)getTimeTicks()/cv::getTickFrequency(); }
double TickMeter::getTimeMilli() const { return getTimeMicro()*1e-3; }
double TickMeter::getTimeSec() const { return getTimeMilli()*1e-3; }

修正後のtick_meter.hpp

double TickMeter::getTimeMicro() const { return getTimeMilli()*1e3; }
double TickMeter::getTimeMilli() const { return getTimeSec()*1e3; }
double TickMeter::getTimeSec() const { return (double)getTimeTicks()/cv::getTickFrequency(); }

サンプルコード

OpenCV 3.0でTickMeterを使うサンプルコードは以下の通りです.

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include "tick_meter.hpp" // TickMeterクラスを使うためにインクルードする
#include <iostream>

int main(int argc, const char* argv[])
{
    cv::Mat src = cv::imread("lena.jpg", cv::IMREAD_COLOR);
    cv::Mat dst;

    // 画像の読み込みに失敗したらエラー終了する
    if (src.empty())
    {
        std::cerr << "Failed to open image file." << std::endl;
        return -1;
    }

    TickMeter meter;

    // 測りたい処理の前にTickMeterクラスのstartメソッドを呼ぶ
    meter.start();

    // 測りたい処理
    cv::resize(src, dst, cv::Size(), 5.0, 5.0);

    // 測りたい処理の後にTickMeterクラスのstopメソッドを呼ぶ
    meter.stop();

    // getTimeMilliメソッドを呼ぶ(※ミリ秒単位の結果を取得できる)
    std::cout << meter.getTimeMilli() << "[ms]" << std::endl;

    return 0;
}

注意点

  • OpenCV 2.4.xではcv名前空間内で定義されていたのでcv::TickMeterとして使用できましたが,3.0同梱のtick_meter.hppでは名前空間が使われていないのでTickMeterとして使用する必要があります.

    • tick_meter.hppにnamespaceを追加すればOpenCV 2.4.xと同じような使い方が可能です.
  • OpenCVヘッダインクルードの後に#include "tick_meter.hpp"としてインクルードする必要があります.

    • tick_meter.hppの先頭に#include <opencv2/core.hpp>を追加すればこの制限はなくすことができます.

備考

筆者はOpenCV 3.0.0で動作確認しました.


Menu

Computer Vision

GPGPU

AR

ROS

Docker

Jetson

ARM

プログラミング言語

開発環境

勉強会

Clone this wiki locally