閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

OpenCVのMat構造体で任意の列を処理したいとき

メモリ構造を考えるとそれはそう、という話なんですが、こういうコードを書くと実行時間に差が出ます。

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

for (int i = 0; i < 1000; ++i)
{
    const auto m = cv::mean(mat.row(i))[0];
}

ticks.stop();
std::cout << ticks << std::endl;

ticks.reset();
ticks.start();

for (int i = 0; i < 1000; ++i)
{
    const auto m = cv::mean(mat.col(i))[0]; // ここの処理はなんでもいい (この例だとreduceで良くなっちゃうけど)
}

ticks.stop();
std::cout << ticks << std::endl;
0.0058812sec // mat.row
0.343708sec  // mat.col

ずっと一次元のデータと戯れてきたため二次元とか行列は知見がなくて、こういう時どうするのが良いんでしょう。transposeしちゃう?

cv::transpose(mat, mat);
for (int i = 0; i < 1000; ++i)
{
    const auto m = cv::mean(mat.row(i))[0];
}