2012-05-31 3 views
3

저는 opencv2.3.1을 사용하여 이미지에서 SIFT 키포인트를 감지하고 있습니다. 그러나 나는 그 탐지 결과에서 중복 된 점이 있음을 발견했다. 즉, 동일한 좌표 (픽셀 단위)를 갖는 두 개의 키포인트가 있지만, 이들의 대응하는 디스크립터는 매우 상이하다. 다음 코드는 SIFT 추출 절차를 보여줍니다. 나는 사람들이 사용 된 "box.png"에 익숙해야한다고 생각합니다. 따라서 관심있는 사람은 다음 코드를 시도해보고 나와 같은 문제가 있는지 확인할 수 있습니다.하나의 이미지에서 키포인트를 중복 표시합니다.

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include <iostream> 
int main() 
{ 
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("SIFT"); 
cv::Ptr<cv::DescriptorExtractor> extractor = cv::DescriptorExtractor::create("SIFT"); 
cv::Mat im = cv::imread("box.png", CV_LOAD_IMAGE_COLOR); 
std::vector<cv::KeyPoint> keypoints; 
cv::Mat descriptors; 
detector->detect(im, keypoints); 
extractor->compute(im,keypoints,descriptors); 
int duplicateNum = 0; 
for (int i=0;i<keypoints.size();i++) 
{ 
    for (int j=i+1;j<keypoints.size();j++) 
    { 
     float dist = abs((keypoints[i].pt.x-keypoints[j].pt.x))+abs((keypoints[i].pt.y-keypoints[j].pt.y)); 
     if (dist == 0) 
     { 
      cv::Mat descriptorDiff = descriptors.row(i)-descriptors.row(j); 
      double diffNorm = cv::norm(descriptorDiff); 
      std::cout<<"keypoint "<<i<<" equal to keypoint "<<j<<" descriptor distance "<<diffNorm<<std::endl; 
      duplicateNum++; 
     } 
    } 
} 
std::cout<<"Total keypoint: "<<keypoints.size()<<", duplicateNum: "<<duplicateNum<<std::endl; 

return 1; 

}

답변

1

네, 사실입니다 - 기술자가 몇 가지 키포인트에 대해 여러 설명을 생산 SIFT의 OpenCV의 구현, 그들은 도움

4

희망 (키포인트의 설명 추정 지배적 인 방향을 SIFT) 방향으로 차이가 너는 그 이유를 이해한다.

키포인트 주변의 모든 픽셀에 대해 크기와 방향이 계산됩니다. 그런 다음 히스토그램이 생성됩니다. 이 막대 그래프에서 360도 방향은 36 개의 저장소 (각 10도)로 나뉩니다. 특정 지점 ("오리엔테이션 수집 지역"의)에서 그라디언트 방향이 18.759도라고 말하면 10-19도 빈으로 들어갑니다. 그리고 빈에 추가되는 "양"은 그 지점에서 그라디언트의 크기에 비례합니다. 키포인트 주변의 모든 픽셀에 대해이 작업을 수행하면 막대 그래프의 어느 지점이 피크를 갖게됩니다.

20-29도에서 막대 그래프의 피크를 볼 수 있습니다. 따라서 키포인트에는 방향 3 (세 번째 빈)이 할당됩니다.

또한 가장 높은 피크의 80 %를 초과하는 모든 피크는 새로운 키포인트으로 변환됩니다. 이 새로운 키포인트는 원래 위치와 크기가 동일합니다. 그러나 오리엔테이션은 다른 피크와 같습니다.

그래서 방향은 하나의 키포인트를 여러 개의 키포인트로 나눌 수 있습니다. SIFT에 대한

위대한 참조 :

같은 키포인트하지만 서로 다른 설명은 다음과 같이 :

enter image description here

enter image description herehttp://aishack.in/tutorials/sift-scale-invariant-feature-transform-introduction/

+0

예, 그렇습니다. 그러나 그것은 틀린 Itnt인가? 아니면 순차적 인 이미지/프레임에서 일치를 찾는 데 문제가 발생하지는 않습니까? –

+0

@farzin 맞습니다. SIFT 포인트의 견고성을 향상시키기 위해 작성자가이를 추가합니다. – vancexu

+0

중복이 동일한 위치를 가리킬 때 견고성으로 간주되어야하는 이유는 무엇입니까? –

1

나는 .NET에서 SIFT를 구현하여 같은 문제에 직면

+0

그 이유는 무엇입니까? –

+0

@ vancexu : "회전으로 인해 키포인트를 놓치지 않고 올바른 일치를 얻을 수있는 기회가 더 많습니다." 이는 오해의 소지가있는 프레임간에 일치하는 경우에 유용합니다. 예를 들어 일부 일치 알고리즘에서는 최소한 5 점이 필요합니다.우리가 2 개의 중복 포인트를 가지고 있다면 어떻게 될까요? 나는 그와 같은 매칭 알고리즘에있어서 장점이 될까봐 걱정된다. –

관련 문제