Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
在不重复创建图像金字塔的情况下,使用OpenCV描述SIFT_Opencv_Sift - Fatal编程技术网

在不重复创建图像金字塔的情况下,使用OpenCV描述SIFT

在不重复创建图像金字塔的情况下,使用OpenCV描述SIFT,opencv,sift,Opencv,Sift,我正在使用OpenCV 2.4.6,我需要在一张特定的图像上多次计算不同位置的SIFT描述符。代码运行速度非常慢。我意识到这可能是因为每次我调用sift(图像、掩码、位置、描述符、true)时,OpenCV都会创建一个图像金字塔。我该怎么办? PS:掩码选项没有帮助 部分代码如下所示 Mat image = imread ("test.jpg"); vector<KeyPoint> locations; Mat descriptors; for (int i=0 ; i<n ;

我正在使用OpenCV 2.4.6,我需要在一张特定的图像上多次计算不同位置的SIFT描述符。代码运行速度非常慢。我意识到这可能是因为每次我调用sift(图像、掩码、位置、描述符、true)时,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);
Mat image=imread(“test.jpg”);
矢量位置;
Mat描述符;

对于(int i=0;i来说,一个快速的解决方案是调用
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

用于(int i=0;你能给我们更多关于你想要实现什么的详细信息吗,你的代码的一小部分,带有期望输出的图像?嗨,我已经添加了一个代码块来显示我在做什么。我建议使用其他检测器和描述符,速度要快得多。检测器示例:FAST,BRISK,ORB,STAR,描述符示例:BRISK,BRIEF,ORB,FREAK.T这些是二进制描述符。如果您愿意,我可以让您参考我写的一些关于二进制描述符的帖子。这是一个常见的问题……我想您必须查看SIFT实现的openCV源代码,并以您需要的方式封装函数[computePyramid=>save pyramid=>computeFeatures(pyramid)=>computeDescriptors(功能,金字塔)]并重新编译修改后的openCV。如果运气不好,openCV只给出标题和库,因为SIFT上有专利,它在非自由库中,我不知道。谢谢米卡,我会研究它。当然,但在计算一些描述符之前,我无法确定所有位置。