मैं पैमाने और रोटेशन के लिए एक विधि की तलाश कर रहा हूं, जो कि अपरिवर्तनीय टेम्पलेट मिलान है। मैंने पहले से ही कुछ करने की कोशिश की, लेकिन उन्होंने मेरे उदाहरणों के लिए इतना अच्छा काम नहीं किया या निष्पादित करने के लिए हमेशा के लिए ले लिया। 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
मैंने उस तरीके के बारे में पढ़ा। ध्रुवीय निर्देशांक के मानचित्रण ने काम किया, लेकिन मुझे नहीं पता कि यह सही है या नहीं। चित्र इस तरह दिखते हैं।
और OpenCV के टेम्पलेट मिलान समारोह के साथ इन 2 छवियों के मिलान के बाद मुझे वह परिणाम मिला
अब मैं नहीं जानता कि कैसे जाना है।
मेरे खाके हमेशा ब्लूप्रिंट और ब्लूप्रिंट के निर्माण में सरल प्रतीक होते हैं। प्रतीक आकार और अभिविन्यास में भिन्न हो सकते हैं।
उदाहरण के लिए मेरा साधारण खाका:
और मेरा खाका
इस उदाहरण में केवल एक टेम्पलेट है, लेकिन ब्लूप्रिंट में यह सभी घटनाओं, यहां तक कि आकार और / या झुकाव वाले लोगों को ढूंढना चाहिए।
क्या किसी के पास एक दृष्टिकोण है कि मैं इसे कैसे हल कर सकता हूं?
संपादित करें:
एंड्री के दृष्टिकोण के अलावा। रेडियल प्रोफाइल के लिए दूरी कैप्चरिंग एल्गोरिथ्म। (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;
}