用OpenCV描述SIFT而不重复创建图像金字塔

时间:2013-12-06 06:23:18

标签: opencv sift

我正在使用OpenCV 2.4.6,我需要在一个特定图像上多次在不同位置计算SIFT描述符。代码运行速度极慢。我意识到这可能是因为每当我调用sift(图像,蒙版,位置,描述符,真实)时,OpenCV都会创建一个图像金字塔。我该怎么办? PS:掩码选项无效。

部分代码就是这样。

Mat image = imread ("test.jpg");
vector<KeyPoint> locations;
Mat descriptors;
for (int i=0 ; i<n ; ++i)
    locations.push_back(KeyPoint(x[i],y[i],sigma[i]));
SIFT sift;
sift (image, noArray(), locations, descriptors);
//do something...
locations.clear();
for (int j=n ; j<2*n; ++j)
    locations.push_back(KeyPoint(x[j],y[j],sigma[j]));
sift (image, noArray(), locations, descriptors);

我认为OpenCV会创建两次相同的图像金字塔。

1 个答案:

答案 0 :(得分:0)

快速解决方案是在您使用的所有位置只调用一次sift(...)

for (int i=0 ; i<n ; ++i)
  locations.push_back(KeyPoint(x[i],y[i],sigma[i]));
//do something...
const size_t N = locations.size();

for (int j=n ; j<2*n; ++j)
  locations.push_back(KeyPoint(x[j],y[j],sigma[j]));

sift (image, noArray(), locations, descriptors);

// locations[0..N-1] are the first ones, locations[N..size()-1] are the others