opencv 调整函数大小执行时间慢



我正面临着第一次使用opencv(3.0)调整大小功能(使用Windows上的Visual Studio)的缓慢执行时间。以下简单程序显示了该问题:

int _tmain(int argc, _TCHAR* argv[])
{
   DECLARE_TIMING(ttt);
   START_TIMING(ttt);
   cv::Mat tmp1=cv::Mat::ones(100,100, CV_8UC3);
   cv::Mat res1=cv::Mat::zeros(100*0.25, 100*0.25, CV_8UC3);
   cv::resize(tmp1, res1, cv::Size(0,0), 0.25f, 0.25f, CV_INTER_AREA);
   STOP_TIMING(ttt);
   double runTime = GET_TIMING(ttt);
   std::cout << "First resize run time = " << runTime << " mSecn"; 
   START_TIMING(ttt);
   cv::Mat tmp2=cv::Mat::ones(100,100, CV_8UC3);
   cv::Mat res2=cv::Mat::zeros(100*0.25, 100*0.25, CV_8UC3);
   cv::resize(tmp2, res2, cv::Size(0,0), 0.25f, 0.25f, CV_INTER_AREA);
   STOP_TIMING(ttt);
   runTime = GET_TIMING(ttt);
   std::cout << "Second resize run time = " << runTime << " mSecn";    
   return 0;
}

结果是:

First resize run time = 259.575 mSec
Second resize run time = 0.0769735 mSec

现在为什么第一次调整大小使用需要 259 毫秒,而第二次需要更少?(注意,我知道不需要 res1 和 res2 的预分配,这是我努力克服这个问题的一部分)

怀疑这与函数cv::resize中的static变量初始化有关。

static ResizeFunc linear_tab[] = ...
static ResizeFunc cubic_tab[] = ...
static ResizeFunc lanczos4_tab[] =
static ResizeAreaFastFunc areafast_tab[] = ...
static ResizeAreaFunc area_tab[] = ...

static变量在第一次执行命中其声明时初始化。

这是一个等效于你的片段,没有宏或 Windows 相关的东西。您可以看到,如果取消注释对resize的第一个虚拟调用,则后续调用的执行时间几乎相同。

#include <opencv2opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
    // Dummy call to initialize static variables.
    //resize(Mat1b(1, 1), Mat1b(1, 1), Size(1, 1));
    cv::Mat tmp1 = cv::Mat::ones(100, 100, CV_8UC3);
    cv::Mat res1 = cv::Mat::zeros(100 * 0.25, 100 * 0.25, CV_8UC3);
    double tic1 = double(getTickCount());
    cv::resize(tmp1, res1, cv::Size(0, 0), 0.25f, 0.25f, CV_INTER_AREA);
    double toc1 = (double(getTickCount()) - tic1) * 1000.0 / getTickFrequency();
    std::cout << "First resize run time = " << toc1 << " ms" << std::endl;

    cv::Mat tmp2 = cv::Mat::ones(100, 100, CV_8UC3);
    cv::Mat res2 = cv::Mat::zeros(100 * 0.25, 100 * 0.25, CV_8UC3);
    double tic2 = double(getTickCount());
    cv::resize(tmp2, res2, cv::Size(0, 0), 0.25f, 0.25f, CV_INTER_AREA);
    double toc2 = (double(getTickCount()) - tic2) * 1000.0 / getTickFrequency();
    std::cout << "Second resize run time = " << toc2 << " ms" << std::endl;
    getchar();
    return 0;
}

最新更新