2013-04-11 3 views
9

SIFT + RANSAC 및 Homography를 사용하여 개체 (OpenCV C++, Java)를 찾는 응용 프로그램을 개발 중입니다. 내가 직면하고있는 문제는 RANSAC의 성능이 좋지 않은 곳이 많다는 것입니다.SIFT 일치 및 인식?

나는 이런 이유로 SIFT의 저자가 투표하기 매우 좋았다 : 투표하기를 시도하고 싶다. (사람이 Traslation을 말한다)

  • 위치 [Y, X,]는
  • 규모
  • 방향
  • : 우리는 4 개 차원은 4 차원 특징 공간에서 투표해야 읽었습니다

    ,691 :

동안을 OpenCV와 함께와 경기 scaleorientation를 쉽게 얻을

cv::Keypoints.octave 
cv::Keypoints.angle 

위치를 계산하는 방법을 이해하는 데 어려움을 겪고 있습니다.

이 난 단지 one match으로 우리가 경계 상자를 그릴 수 있습니다 interesting slide을 발견했다 :

하지만 단지 하나의 일치로 그 경계 상자를 그릴 수 어떻게하지 않습니다. 어떤 도움이 필요합니까?

답변

5

이미지 1에서 이미지 2 로의 기하학적 변환에 가장 적합한 일치하는 피쳐 세트를 찾고 있습니다.이 경우 유사어 변환은 번역 (dx, dy), 축척 변경 ds 및 회전 d_theta.

의 당신은 기능과 일치 한 가정 해 봅시다 : 이미지 2.하자의 이미지 1, F2에서 F1은 규모가 될 s1을하자, 이미지 1 (F1)의 위치, 그리고 theta1가이 방향으로의하자 (x1,y1). 마찬가지로 f2의 경우 (x2,y2), s2theta2입니다.

두 기능 간 변환은 (dx,dy) = (x2-x1, y2-y1)입니다.

두 피처 간의 축척 변경은 ds = s2/s1입니다.

두 피쳐 간의 회전 각도는 d_theta = theta2 - theta1입니다.

따라서 dx, dy, dsd_theta은 Hough 공간의 크기입니다. 각 bin은 유사성 변환에 해당합니다.

Hough 투표를 수행하고 최대 빈을 찾으면 해당 bin으로 이미지 1에서 이미지 2로 변환됩니다. 할 수있는 한 가지 방법은 이미지 1의 경계 상자를 가져 와서 해당 변환을 사용하여 변환하는 것입니다. 해당 번역, 회전 및 크기 조정을 이미지 모서리에 적용합니다. 일반적으로 매개 변수를 변형 행렬에 저장하고 동질의 좌표를 사용합니다. 그러면 이미지 2의 경계 상자가 감지 된 객체에 해당합니다.

+0

답변을 수정했습니다. – Dima

+1

하나가 일치하면 Hough 변환이 필요 없습니다. x와 y의 차이 (이동), 방향의 차이 (회전) 및 비율 (비율)의 비율을 취합니다. 그런 다음 그것을 매트릭스에 넣습니다. – Dima

2

Dima을 완성하려면 4D Hough 공간이 (가능하면 작은) 4D 상자에 양자화되어 있다는 것을 추가해야합니다. 각 상자는 4D 상자 중심에서 주어진 유사도에 해당합니다.

그런 다음, 기능의 임시 일치를 통해 얻은 각각의 가능한 유사성에 대해 4D 공간에서 해당 상자 (또는 )에 1을 추가하십시오. 출력 유사성은 더 많은 표를 가진 셀에 의해 주어진다.

1 개의 일치 항목에서 변환을 계산하려면 그의 답변에 Dima의 공식을 사용하십시오. 여러 쌍의 경기의 경우, 최소 제곱합을 사용해야 할 수도 있습니다.

마지막으로 변환은 cv::warpPerspective() 함수로 적용 할 수 있습니다. 여기서 투시 행렬의 세 번째 행은 [0,0,1]으로 설정됩니다.

+0

이것은 하나의 단일 일치로 경계 상자를 그리는 방법을 설명합니다. – dynamic

+0

테두리 상자는 모델 이미지의 파란색 상자와 노란색 상자에 최종 일치도 (Huff 투표에서 1 점을 얻음)를 적용한 다음 그립니다 소설 이미지에서. – sansuiso

+0

최종 유사 매트릭스를 계산하는 방법에 대한 예를 게시 할 수 있습니까? – dynamic

2

허프 (Hough) 변환을 사용할 때 템플릿 중력 (또는 중심점의 도움으로)에서 모든 지형의 변위 ​​벡터를 저장하는 서명을 만듭니다.

예. 템플릿에있는 10 개의 SIFT 피쳐에 대해 템플릿의 중심에 따른 상대 위치는 vector<{a,b}>입니다. 이제 쿼리 이미지에서이 개체를 검색해 봅시다. 쿼리 이미지에서 발견되는 모든 SIFT 기능 (템플릿 10 중 하나와 일치)은 투표를 해당 중심에 캐스팅합니다.

votemap(feature.x - a*, feature.y - b*)+=1 여기서 a, b는이 특정 특징 벡터에 해당합니다.

일부 기능이 동일한 지점에서 성공적으로 캐스팅 되었으면 (클러스터링이 필수적 임), 객체 인스턴스를 발견했습니다.

enter image description here

서명하고 투표는 반대 절차입니다. V=(-20,-10)이라고 가정 해 보겠습니다. 따라서 소설 이미지에서 검색하는 동안 두 개의 일치 항목이 발견되면 우리는 그들의 방향과 크기를 감지하고 각각의 투표를합니다. 예 : 오른쪽 상자 중심의 경우 SIFT 기능에서 반쪽으로 V'=(+20*0.5*cos(-10),+10*0.5*sin(-10)) 떨어져 있으며 크기가 절반이므로 -10도 회전합니다.

+0

"하나의 일치"란 무엇을 의미합니까? 일치하는 기능의 성격은 무엇입니까? 예제에서 노란색 상자와 같은 점 (x, y) 또는 영역 (x, y, a, b, theta)? – William

+0

그런 다음 SIFT ** Descriptor **를 서명에 포함하고 일치하는 패치의 회전 및 크기 조정을 DescriptorMatcher에서 추출해야합니다. – William