Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ opencv resize函数执行时间慢_C++_Opencv_Resize - Fatal编程技术网

C++ opencv resize函数执行时间慢

C++ opencv resize函数执行时间慢,c++,opencv,resize,C++,Opencv,Resize,第一次使用opencv(3.0)resize功能(在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,

第一次使用opencv(3.0)resize功能(在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 << " mSec\n"; 

   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 << " mSec\n";    

   return 0;

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

我怀疑这与函数
cv::resize
中的
静态变量初始化有关

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

这是一个相当于您的代码片段,没有宏或与Windows相关的内容。您可以看到,如果对第一个伪调用
resize
进行反注释,则以下调用的执行时间几乎相同

#include <opencv2\opencv.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;
}
#包括
#包括
使用名称空间cv;
使用名称空间std;
int main()
{
//初始化静态变量的伪调用。
//调整大小(Mat1b(1,1),Mat1b(1,1),大小(1,1));
cv::Mat tmp1=cv::Mat::One(100100,cv_8UC3);
cv::Mat res1=cv::Mat::Zero(100*0.25100*0.25,cv_8UC3);
double tic1=double(getTickCount());
cv::resize(tmp1、res1、cv::Size(0、0)、0.25f、0.25f、cv\u内部区域);
double toc1=(double(getTickCount())-tic1)*1000.0/getTickFrequency();

Std::谢谢。这个虚拟调整需要260毫秒运行!…我认为有必要在OpenCV内查看这个问题的解决方案。这不是OpenCV问题,而是静态变量如何在C++中工作。请记住OpenCV不是一个实时库。记住,在释放模式下运行。对我来说,只需要几毫秒。第一个电话,没什么大不了的。
#include <opencv2\opencv.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;
}