OpenCVメモリ使用量計測 - atinfinity/lab GitHub Wiki
Hacking OpenCV for fun and profitというブログ記事にて「OpenCVを拡張したメモリ使用量計測方法」が紹介されていたので,ここではその機能について紹介します.
- OpenCVメモリ使用量計測機能が入ったソースを取得する
- 必要な箇所をマージする(後程追記します)
- CMakeオプションENABLE_MEMORY_SNAPSHOTSをONにしてOpenCVをビルドする
- OpenCVを利用したプログラム中で計測したい箇所をMEASURE_MEMORYマクロで囲む
#define MEASURE_MEMORY(x) { \
    size_t memOnStart = cv::memorySnapshot().allocatedMemory; x;\
    size_t memOnEnd  = cv::memorySnapshot().allocatedMemory;     \
    std::cout << #x << "," << "\t" << memOnStart / (1024.0*1024.0) << "[MB]" << \
    " -> " << \
    memOnEnd / (1024.0*1024.0) << "[MB]" << std::endl; }- 処理xを行う前のOpenCVメモリ使用量(memOnStart)を取得する
- 処理xを実行する
- 処理xを行った後のOpenCVメモリ使用量(memOnEnd)を取得する
- memOnStart、 memOnEndの値を標準出力する
- OpenCV APIが使用するメモリ量しか計測できない
- CMakeオプションENABLE_MEMORY_SNAPSHOTSをONにしたOpenCVビルドでしか計測できない
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#define ENABLE_MEASURE_MEMORY
#ifndef ENABLE_MEASURE_MEMORY
#define MEASURE_MEMORY(x) {x;}
#else
#define MEASURE_MEMORY(x) { \
    size_t memOnStart = cv::memorySnapshot().allocatedMemory; x;\
    size_t memOnEnd   = cv::memorySnapshot().allocatedMemory;   \
    std::cout << #x << "," << "\t" << memOnStart / (1024.0*1024.0) << "[MB]" \
    << " -> " << \
    memOnEnd / (1024.0*1024.0) << "[MB]" << std::endl; }
#endif
int main(int argc, char** argv)
{
    cv::Mat src, dst;
    MEASURE_MEMORY(src = cv::imread("lena.jpg", cv::IMREAD_COLOR));
    MEASURE_MEMORY(cv::resize(src, dst, cv::Size(), 5.0, 5.0));
    MEASURE_MEMORY(dst.release());
    return 0;
}src = cv::imread("lena.jpg", cv::IMREAD_COLOR), 0.332099[MB] -> 1.0821[MB]
cv::resize(src, dst, cv::Size(), 5.0, 5.0),     1.0821[MB] -> 19.8321[MB]
dst.release(),  19.8321[MB] -> 1.0821[MB]