2013-10-19 230 views
2

我想了解如何获取OpenCV中给定的KeyPoint的描述符。到目前为止,我的代码如下所示:KeyPoint描述符OpenCV

#include <iostream> 
#include "opencv2/opencv.hpp" 

typedef cv::Mat Image; 

int main(int argc, const char * argv[]) 
{ 

    Image imgA = cv::imread("images/buddhamulticam_total100.png", 
           CV_LOAD_IMAGE_GRAYSCALE); 
    Image imgB = cv::imread("images/buddhamulticam_total101.png", 
          CV_LOAD_IMAGE_GRAYSCALE); 

    cv::Ptr<cv::FeatureDetector> detector = 
        cv::FeatureDetector::create("ORB"); 
    cv::Ptr<cv::DescriptorExtractor> descriptor = 
        cv::DescriptorExtractor::create("ORB"); 

    std::vector<cv::KeyPoint> keyPointsA, keyPointsB; 

    keyPointsA.push_back(cv::KeyPoint(0,0,5)); 
    keyPointsB.push_back(cv::KeyPoint(10,10,5)); 

    cv::Mat descriptorA, descriptorB; 
    descriptor->compute(imgA, keyPointsA, descriptorA); 
    descriptor->compute(imgB, keyPointsB, descriptorB); 

    std::cout << "DescriptorA (" << descriptorA.rows << "," << 
       descriptorA.cols << ")" << std::endl; 
    std::cout << "DescriptorB (" << descriptorB.rows << "," 
       << descriptorB.cols << ")" << std::endl; 
    return 0; 
} 

问题是我没有在描述符中获取数据。我错过了什么? 您能否更详细地解释传递给KeyPoint对象的参数是什么?我对计算机视觉+ OpenCV很陌生,因此可能对OpenCV的文档有更好的解释。

+0

让我明白,点(0,0)和(10,10)? – GilLevi

+0

是的,这就是opencv的文档所说的。 – BRabbit27

+0

然后看到我的回答:) – GilLevi

回答

1

您试图在点(0,0)和(10,10)上计算机ORB,但它们距图像边界太近,因此ORB无法计算这些位置中的描述符。 ORB(以及其他二进制描述符)将它们过滤掉。

编辑:由于您问到使用情况,我正在编辑答案。你应该传递整个图像。我使用它作为:

Ptr<FeatureDetector> detector = FeatureDetector::create(detector_name); 
Ptr<DescriptorExtractor> descriptor = DescriptorExtractor::create(descriptor_name); 

detector->detect(imgK, kp); 
descriptor->compute(imgK, kp, desc); 
+0

好吧,我明白了,但创建'KeyPoint'并将其传递给'DescriptorExtractor'的方式可以吗?如果我在图像中取一个5x5的小块,计算描述符时应该传递整个图像还是仅传递该补丁? – BRabbit27

+0

看我的回答:) – GilLevi