2016-12-08 17 views
1

OpenCVVLFeat의 SIFT 구현을 비교하려고합니다. OpenCV의에 대한SIFT 설명자 값 : OpenCV vs VLFeat

0 0 0 0 0 0 0 0 0 0 0 17 45 20 26 0 1 ...

동안 : 다음은 2 개 개의 다른 이미지에 대한 설명입니다

0.0391555 0 0 0.0998274 0.235747 0 0 0.0276871 0.156622 ...

공지 것을

나는 VLFeat에 대한 설명 값이 같은 정수 것으로 나타났습니다.

  1. 왜 그들은 두 개의 서로 다른 값을 가질 :

    나는이 개 질문이?

  2. VLFeat (및 VLAD 인코딩)를 사용하여 k-means에 대한 OpenCV 표현이 필요하면이 값을 변경해야합니까?

답변

1

면책 조항, 나는 OpenCV 또는 VLFeat의 전문가가 아니지만 답변을 알고 있다고 생각합니다.

VLFeat는 정수 및 부동 소수점 설명자를 생성 할 수 있습니다. 정수 설명자를 생성하려면 vl_sift 함수를 사용하고 float 설명자를 생성하려면 FloatDescriptors 매개 변수와 함께 vl_dsift 함수를 사용하십시오.

VLFeat는 성능상의 이유로 정수 설명자를 사용합니다. 정수를 사용하는 계산은 일반적으로 수레를 사용하는 것보다 빠릅니다. 그러나 정확성을 희생 할 수 있습니다. 그럼에도 불구하고, 컴퓨터 비전의 경우 작은 정밀도가 그렇게 중요하지 않을 수 있습니다. integer k-means algorithm의 설명에서 "일부 응용 프로그램에서는 제한적이지만 매우 높은 정밀도는 일반적으로 불필요한 이미지 설명자를 클러스터링하는 데 적합합니다"라고 읽을 수도 있습니다.

k-는 알고리즘을 의미합니다. 부동 소수점 기술자를위한 버전 (vl_ikmeans)과 부동 소수점 기술자를위한 버전 (vl_kmeans)이 있습니다. OpenCV를 사용하면 간단하게 후자를 사용할 수 있습니다.

+0

'vl_sift'와'vl_dsift'는 * 완전히 다른 알고리즘 w.r.t입니다. 키포인트 생성 절차는 설명자 값 (int 또는 float)을 기반으로 비교할 수 없습니다. – justHelloWorld

+0

VLFeat [documentation] (http://www.vlfeat.org/matlab/vl_dsift.html)에 따르면 : "기본적으로 VL_DSIFT()는 VL_SIFT()와 동일한 기능을 계산합니다". "이 예제는 VL_DSIFT() 및 VL_SIFT()를 사용하여 동일한 SIFT 설명자를 생성합니다." –

+0

내 잘못으로 기본 동작이 동일하다는 것을 알지 못했습니다. (-1을 제거했습니다.)). 그러나 DSIFT는 "밀도가 높은 SIFT"를 의미하며 키포인트는 표준 그리드에서 생성됩니다. 어쩌면 같은 동작을 얻을 수 있지만 두 알고리즘의 목적이 다릅니다. – justHelloWorld