Opencv 计算非关键点的SURF/SIFT描述符

Opencv 计算非关键点的SURF/SIFT描述符,opencv,sift,surf,feature-extraction,Opencv,Sift,Surf,Feature Extraction,实际上,我正在尝试将从一幅图像中提取的关键点列表与从另一幅图像中提取的关键点列表进行匹配。我尝试了SURF/SIFT来检测关键点,但结果与从每张图像中检测到的关键点的准确性不符。我考虑不使用关键点检测器,只使用连接区域的点,然后使用SIFT/SUFT计算这些点的描述符,但大多数情况下调用计算方法将清空关键点列表 下面的代码示例: int minHessian = 100; SurfFeatureDetector detector(minHessian); Mat descriptors_o

实际上,我正在尝试将从一幅图像中提取的关键点列表与从另一幅图像中提取的关键点列表进行匹配。我尝试了SURF/SIFT来检测关键点,但结果与从每张图像中检测到的关键点的准确性不符。我考虑不使用关键点检测器,只使用连接区域的点,然后使用SIFT/SUFT计算这些点的描述符,但大多数情况下调用计算方法将清空关键点列表

下面的代码示例:

int minHessian = 100;
 SurfFeatureDetector detector(minHessian);  
Mat descriptors_object;
 SurfDescriptorExtractor extractor;
 detector.detect( img_object, keypoints_object); 
 extractor.compute( img_object, keypoints_object,descriptors_object ); 
 for (int index = 0; index < listOfObjectsExtracted.size(); index ++)
 {
         Mat partOfImageScene = listOfObjectsExtracted[index];
         vector<Point2f> listOfContourPoints = convertPointsToPoints2f(realContoursOfRects[index]);
         vector<KeyPoint> keypoints_scene;
         KeyPoint::convert(listOfContourPoints, keypoints_scene, 100, 1000);
         //detector.detect( partOfImageScene, keypoints_scene );
         if (keypoints_scene.size() > 0)
         {
             //-- Step 2: Calculate descriptors (feature vectors)
             Mat descriptors_scene;
             extractor.compute( partOfImageScene, keypoints_scene, descriptors_scene );
            //Logic of matching between descriptors_scene and descriptors_object 
         } 
}
就尺寸而言,100号在我看来很好,不是吗?如果没有,有什么方法可以获得适合我的情况的最佳价值?还是仅仅凭经验

已编辑: 图像的大小是1920*1080,这是一个


大多数时候,它们都靠近图像的边界。这有什么问题吗?

我想出来了。问题在于我计算描述符的方式,因为正如您在上面的代码中所看到的,我试图在图像的一小部分而不是图像本身上计算描述符。因此,当我将图像本身而不是图像场景的
partOfImageScene
,类似于
extractor.compute(img\u场景、keypoints\u场景、descriptor\u场景)它工作得很好,我没有从我的列表中丢失任何关键点

您给自定义关键点的“大小”或“比例”是多少?根据该值,计算描述符窗口的大小。如果它太大(或者可能太小),则无法计算描述符。编辑问题,@Mickacan you try size=1?不确定大小在SIFT/Surf中是如何定义的(例如,描述符窗口大小是如何从关键点大小计算出来的),但可能是8、16等值,但我真的不记得是哪个倍频程……嗯。。。一些轮廓也靠近图像边界。。。如果增加关键点的大小,删除的关键点的数量确实会增加?描述符有一定的大小。在该大小内,像素值用于描述。如果关键点周围描述符的范围超出图像,则该描述符区域没有像素值,因此无法计算“良好”描述符。计算描述符就像问:“关键点的MxN邻域是什么样子的?”
//! converts vector of points to the vector of keypoints, where each keypoint is assigned the same size and the same orientation
    static void convert(const vector<Point2f>& points2f,
                        CV_OUT vector<KeyPoint>& keypoints,
                        float size=1, float response=1, int octave=0, int class_id=-1);