Saya mencari metode untuk pencocokan Templat invarian skala dan rotasi. Saya sudah mencoba beberapa, tetapi mereka tidak bekerja dengan baik untuk contoh saya atau mengambil untuk dieksekusi. Deteksi Fitur SIFT dan SURF gagal total. Saya juga mencoba menerapkan fungsi Pencocokan Log-Polar Template, tetapi saya tidak pernah selesai (tidak tahu persis bagaimana caranya).
Dalam Artikel ini (yang pertama adalah dalam bahasa Jerman)
http://cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/Wentker-Vortrag.pdf
http://www.jprr.org/index.php/jprr/article/viewFile/355/148
Saya membaca tentang metode itu. Memetakan koordinat kutub bekerja, tetapi saya tidak tahu apakah itu benar. Gambarnya terlihat seperti ini.
Dan setelah mencocokkan 2 gambar ini dengan fungsi Pencocokan Templat OpenCV saya mendapatkan hasil itu
Sekarang saya tidak bisa melanjutkan.
Template saya selalu menjadi simbol sederhana dalam membangun cetak biru dan cetak biru itu sendiri. Simbol dapat berbeda dalam ukuran dan orientasi.
Misalnya cetak biru sederhana saya:
Dan template saya
Dalam contoh ini hanya ada satu template, tetapi dalam cetak biru itu harus menemukan semua kejadian, bahkan yang dengan ukuran dan / atau orientasi.
Adakah yang punya pendekatan bagaimana saya bisa menyelesaikan ini?
Edit:
Selain pendekatan Andrey. Algoritma penangkapan jarak untuk profil radial. (Menggunakan 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;
}