배율 및 회전 불변 템플릿 일치 방법을 찾고 있습니다. 나는 이미 몇 가지를 시도했지만 내 예제에서 잘 작동하지 않았거나 실행하는 데 시간이 오래 걸렸습니다. SIFT 및 SURF 기능 감지가 완전히 실패했습니다. 또한 Log-Polar Template Matching 기능을 구현하려고 시도했지만 완료하지 못했습니다 (정확히 방법을 몰랐습니다).
이 기사에서 (첫 번째는 독일어)
http://cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/Wentker-Vortrag.pdf
http://www.jprr.org/index.php/jprr/article/viewFile/355/148
그 방법에 대해 읽었습니다. 극좌표를 매핑하는 것이 효과가 있었지만 그것이 맞는지 모르겠습니다. 이미지는 다음과 같습니다.
그리고이 두 이미지를 OpenCV의 템플릿 매칭 기능과 일치시킨 후에 그 결과를 얻었습니다.
이제 나는 계속하지 않습니다.
내 템플릿은 항상 청사진과 청사진 자체를 빌드 할 때 간단한 기호입니다. 기호의 크기와 방향이 다를 수 있습니다.
예를 들어 간단한 청사진 :
그리고 내 템플릿
이 예제에는 템플릿이 하나만 있지만 청사진에는 크기 및 / 또는 방향이있는 템플릿도 포함됩니다.
누구든지 내가 이것을 해결할 수있는 접근법을 가지고 있습니까?
편집하다:
Andrey의 접근 방식에 추가되었습니다. 방사형 프로파일에 대한 거리 캡처 알고리즘. (EmguCV 사용)
private float[] getRadialProfile( Image<Gray, byte> image, Point center, int resolution )
{
var roi = image.ROI;
if ( !roi.Contains( center ) )
{
return null;
}
var steps = resolution;
var degreeSteps = 360 / (double)resolution;
var data = image.Data;
var peak = 0.0f;
var bottom = double.MaxValue;
var bottomIndex = 0;
var width = roi.Width;
var height = roi.Height;
var minX = roi.X;
var minY = roi.Y;
float[] distances = new float[resolution];
for ( var i = 0; i < steps; i++ )
{
var degree = i * degreeSteps;
var radial = degree * Math.PI / 180.0;
var dy = Math.Sin( radial );
var dx = Math.Cos( radial );
var x = (double)center.X;
var y = (double)center.Y;
while ( true )
{
x += dx;
y += dy;
if ( x >= minX + width || y >= minY + height || x <= minX || y <= minY )
{
x = -1;
y = -1;
break;
}
var pixel = data[(int)y, (int)x, 0];
if ( pixel == 0 )
{
break;
}
}
float distance = 0.0f;
if ( x != -1 && y != -1 )
{
distance = (float)Math.Sqrt( Math.Pow( (center.X - x), 2 ) + Math.Pow( (center.Y - y), 2 ) );
}
distances[i] = distance;
if ( distance > peak )
{
peak = distance;
}
if ( distance < bottom )
{
bottom = distance;
bottomIndex = i;
}
}
// Scale invariance. Divide by peak
for ( var i = 0; i < distances.Length; i++ )
{
distances[i] /= peak;
}
// rotation invariance, shift to lowest value
for ( var i = 0; i < bottomIndex; i++ )
{
distances.ShiftLeft(); // Just rotates the array nothing special
}
return distances;
}