我将使用opencv中的SURF检测器比较图像。为此,我需要比较关键点的大小和方向。例如,我必须提取比第一张图片匹配的关键点匹配更大的第二张图片匹配的关键点。 (关键点1.size>关键点2.size)。

问题:
如何在opencv中提取匹配的关键点的大小?

最佳答案

我不确定我是否完全理解您的问题。

我了解的是:

  • 您将使用关键点比较图像
  • 您要比较匹配的关键点的大小

  • 首先,您要至少2张图片:
    Mat image1; //imread stuff here
    Mat image2; //imread stuff here
    

    然后使用SURF在两个图像中检测关键点:
    vector<KeyPoint> keypoints1, keypoints2; //store the keypoints
    Ptr<FeatureDetector> detector = new SURF();
    detector->detect(image1, keypoints1); //detect keypoints in 'image1' and store them in 'keypoints1'
    detector->detect(image2, keypoints2); //detect keypoints in 'image2' and store them in 'keypoints2'
    

    之后,计算检测到的关键点的描述符:
    Mat descriptors1, descriptors2;
    Ptr<DescriptorExtractor> extractor = new SURF();
    extractor->compute(image1, keypoints1, descriptors1);
    extractor->compute(image2, keypoints2, descriptors2);
    

    然后使用例如带有L2范数的BruteForce匹配关键点的描述符:
    BFMatcher matcher(NORM_L2);
    vector<DMatch> matches;
    matcher.match(descriptors1, descriptors2, matches);
    

    完成这些步骤后,将匹配的关键点存储在 vector “matches”中

    您可以按以下方式获取匹配的关键点的索引:
    //being idx any number between '0' and 'matches.size()'
    int keypoint1idx = matches[idx].query; //keypoint of the first image 'image1'
    int keypoint2idx = matches[idx].train; //keypoint of the second image 'image2'
    

    阅读此以获取更多信息:
    http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html

    最后,要知道匹配的关键点的大小,您可以执行以下操作:
    int size1 = keypoints1[ keypoint1idx ].size; //size of keypoint in the image1
    int size2 = keypoints2[ keypoint2idx ].size; //size of keypoint in the image2
    

    更多信息:http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html

    就是这样!希望这可以帮助

    关于c++ - 如何比较opencv中匹配的kepoint的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27125817/

    10-16 22:32