আমি স্কেল এবং ঘূর্ণন ইনভেরিয়েন্ট টেম্পলেট মিলের জন্য একটি পদ্ধতি খুঁজছি। আমি ইতিমধ্যে কিছু চেষ্টা করেছি, তবে তারা আমার উদাহরণগুলির পক্ষে এত ভাল কাজ করে নি বা কার্যকর করার জন্য কখনও নেয় নি। SIFT এবং SURF বৈশিষ্ট্য সনাক্তকরণ পুরোপুরি ব্যর্থ হয়েছে। আমি লগ-পোলার টেম্পলেট ম্যাচিং ফাংশনটিও বাস্তবায়নের চেষ্টা করেছি, কিন্তু আমি কখনই শেষ করিনি (ঠিক কীভাবে করব তা জানতাম না)।
এই নিবন্ধগুলিতে (প্রথমটি জার্মান ভাষায় রয়েছে)
http://cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/Wentker-Vortrag.pdf
http://www.jprr.org/index.php/jprr/article/viewFile/355/148
আমি সেই পদ্ধতি সম্পর্কে পড়েছি। মেরু স্থানাঙ্ক ম্যাপিং কাজ করেছে, তবে জানি না এটি সঠিক কিনা। চিত্রগুলি দেখতে এইরকম।
এবং এই 2 টি চিত্র ওপেনসিভির টেমপ্লেট মিলের ক্রিয়াকলাপের সাথে মিলে যাওয়ার পরে আমি সেই ফলাফল পেয়েছি
এখন আমি কীভাবে যেতে পারি না।
আমার টেমপ্লেটগুলি সর্বদা ব্লুপ্রিন্ট এবং ব্লুপ্রিন্টগুলি তৈরিতে সাধারণ প্রতীক। প্রতীকগুলি আকার এবং দিকনির্দেশনায় পৃথক হতে পারে।
উদাহরণস্বরূপ আমার সাধারণ নীলনকশা:
এবং আমার টেম্পলেট
এই উদাহরণে কেবলমাত্র একটি টেম্পলেট রয়েছে তবে ব্লুপ্রিন্টগুলিতে এটি সমস্ত উপস্থিতি খুঁজে পাওয়া উচিত, এমনকি আকার এবং / অথবা অভিমুখীকরণগুলিও।
আমি কীভাবে এটি সমাধান করতে পারি তার কি কারও কাছে দৃষ্টিভঙ্গি রয়েছে?
সম্পাদনা:
অ্যান্ড্রে এর পদ্ধতির জন্য একটি সংযোজন। একটি রেডিয়াল প্রোফাইলের জন্য দূরত্ব ক্যাপচারিং অ্যালগরিদম। (এমগুসিভি ব্যবহার করে)
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;
}