C++ 在第一个实例中,特征检测器和描述符的计算时间要长得多

C++ 在第一个实例中,特征检测器和描述符的计算时间要长得多,c++,opencv,feature-detection,C++,Opencv,Feature Detection,我用它来计算图像的关键点和描述符 代码基本上如下所示: Ptr<cv::ORB> orb = cv::ORB::create(); Mat descriptors1, descriptors2...; vector<KeyPoint> keypoints1, keypoints2...; orb->detectAndCompute(img1, noArray(), keypoints1, descriptors1); // first instance

我用它来计算图像的关键点和描述符

代码基本上如下所示:

 Ptr<cv::ORB> orb = cv::ORB::create();
 Mat descriptors1, descriptors2...;
 vector<KeyPoint> keypoints1, keypoints2...;
 orb->detectAndCompute(img1, noArray(), keypoints1, descriptors1);  // first instance
 orb->detectAndCompute(img2, noArray(), keypoints2, descriptors2);  // second instance
 // more detectAndCompute...
Ptr orb=cv::orb::create();
Mat描述符1,描述符2。。。;
向量关键点1,关键点2。。。;
orb->detectAndCompute(img1,noArray(),keypoints1,描述符1);//一审
orb->detectAndCompute(img2,noArray(),keypoints2,描述符2);//二审
//更多检测和计算。。。
我的问题是,第一次detectAndCompute(~0.25秒)比之后所有的detectAndCompute(~0.002s)花费的时间要长得多。为什么会这样

此外,无论图像有多小。第一次检测和计算总是需要0.25秒。这次有没有办法减少


谢谢大家!

在实际数据到达之前计算一次(初始化)对不起,但是您能详细说明一下吗?在应用程序初始化期间,您可以在任何实际相关图像到达之前,对一些虚拟图像执行第一次detectAndCompute调用。然后,您的第一个相关映像将有0.002s,但您的初始化将需要额外的0.25s。这是否可行显然取决于您的应用程序/任务,但在大多数情况下,这种方法是可行的。谢谢您的建议。我试过了,效果很好!我仍然很好奇为什么会这样。硬件优化可能会在运行时进行搜索/测试,必须分配缓冲区,等等。例如,cuda应用程序通常会出现极端的初始化时间。但不确定该函数中的实际原因。可能是SSE指令集修复?不知道。。。