2013-10-19 3 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 (다른 2 진 디스크립터와 마찬가지로)는 이들을 필터링합니다.

편집 : 사용법에 대해 질문했기 때문에 답을 수정 중입니다. 전체 이미지를 전달해야합니다. 나는 그것을 다음과 같이 사용한다 :

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