🐕

opencvのresizeを計測

2024/10/05に公開

リサイズ先のサイズが大きいほうが速いのか、小さいほうが速いのかわからなくなったので、計測用のコードを作りました。

私のマシンでは以下のような感じでした。計測自体はHDサイズのcv::Matデータに対するリサイズを1000回行った場合の合計時間を見ており、大小が見たかったぐらいなので数回の試行の平均を「avg」として示しています。

リサイズ一回当たりの時間(us)

初期幅 初期高さ 圧縮率 avg(us)
1280 720 0.25 207
1280 720 0.5 323
1280 720 (640,360) 318

最終行は、整数で指定しても2行目と変わらないかを確認してみたものです。(内部的に割合から実サイズを最初に計算しているはず)

test.cpp
#include <string>
#include <opencv2/opencv.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <chrono>

using namespace std;


int main (int argc, char* argv[]) {
    cv::Mat img = cv::imread(argv[1], cv::IMREAD_UNCHANGED); //入力画像読み込み
    
    int trial = 1000;
    int loaded_rows = img.rows;
    int loaded_cols = img.cols;

    cv::resize(img, img, cv::Size(1280,720));

    int rows = img.rows;
    int cols = img.cols;

    double shrink_rate = 0.5;
    cv::Mat a;
    cv::resize(img, a, cv::Size(),shrink_rate, shrink_rate);

    cout << "割合指定リサイズ" << endl;
    auto begin = chrono::steady_clock::now();
    for(int i=0; i<trial; i++){
        cv::resize(img, a, cv::Size(),shrink_rate, shrink_rate);
    }
    auto end = chrono::steady_clock::now();
    cout << chrono::duration_cast<chrono::milliseconds>(end - begin).count() << "ms for 1000 times" << endl;

    cout << "サイズ指定リサイズ" <<endl;
    cv::Mat b;
    auto new_size = cv::Size(640, 360);
    cv::resize(img, b, new_size);

    auto begin2 = chrono::steady_clock::now();
    for(int i=0; i<trial; i++){
        cv::resize(img, b, new_size);
    }
    auto end2 = chrono::steady_clock::now();

    cout << chrono::duration_cast<chrono::milliseconds>(end2 - begin2).count() << "ms for 1000 times" << endl;


    return 0;
}

最終サイズが小さいほうが時間は短くなる。また、省いていますが元画像サイズが大きいほうがかかる時間も長いです。

Discussion