Ölçek ve döndürme değişmez Şablon eşleştirme için bir yöntem arıyorum. Zaten bazılarını denedim, ancak örneklerim için çok iyi çalışmadılar veya yürütmek için hiç sürmediler. SIFT ve SURF Özellik tespiti tamamen başarısız oldu. Ayrıca bir Log-Polar Şablon Eşleştirme işlevi uygulamaya çalıştım, ancak hiç bitirmedim (nasıl yapılacağını tam olarak bilmiyordum).
Bu Makalelerde (birincisi almanca)
http://cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/Wentker-Vortrag.pdf
http://www.jprr.org/index.php/jprr/article/viewFile/355/148
Bu yöntemi okudum. Kutupsal koordinatları haritalamak işe yaradı, ama doğru olup olmadığını bilmiyorum. Görüntüler şöyle görünür.
Ve bu 2 görüntüyü OpenCV'nin Şablon Eşleme fonksiyonu ile eşleştirdikten sonra bu sonucu aldım
Şimdi nasıl devam edeceğimi bilmiyorum.
Şablonlarım, planları ve planların kendisini oluştururken her zaman basit sembollerdir. Semboller boyut ve yön bakımından farklılık gösterebilir.
Örneğin benim basit planım:
Ve şablonum
Bu örnekte yalnızca bir şablon vardır, ancak taslaklarda, boyutları ve / veya yönlendirmeleri olanlar da dahil olmak üzere tüm oluşumları bulmalıdır.
Bunu nasıl çözebileceğim kimse var mı?
Düzenle:
Andrey'nin yaklaşımına ek olarak. Radyal profil için mesafe yakalama algoritması. (EmguCV Kullanarak)
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;
}