C++ opencv resize函数执行时间慢
第一次使用opencv(3.0)resize功能(在Windows上使用visual studio)时,我的执行速度很慢。以下简单程序显示了该问题: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,
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;
}