मैं एक बाइनरी छवि का अभिविन्यास ढूंढने की कोशिश कर रहा हूं (जहां अभिविन्यास को जड़त्व के कम से कम पल के धुरी के रूप में परिभाषित किया जाता है, यानी क्षेत्र का कम से कम दूसरा क्षण)। मैं संदर्भ के रूप में रोबोट विजन which can be found here पर डॉ हॉर्न की पुस्तक (एमआईटी) का उपयोग कर रहा हूं।बाइनरी छवि ओरिएंटेशन
Point3d findCenterAndOrientation(const Mat& src)
{
Moments m = cv::moments(src, true);
double cen_x = m.m10/m.m00; //Centers are right
double cen_y = m.m01/m.m00;
double a = m.m20-m.m00*cen_x*cen_x;
double b = 2*m.m11-m.m00*(cen_x*cen_x+cen_y*cen_y);
double c = m.m02-m.m00*cen_y*cen_y;
double theta = a==c?0:atan2(b, a-c)/2.0;
return Point3d(cen_x, cen_y, theta);
}
OpenCV:
OpenCV का उपयोग करना, यहां मेरे समारोह, जहां ए, बी, और सी क्षेत्र के दूसरे क्षणों के रूप में (पाठ के 60 पेज) ऊपर पीडीएफ के पेज 15 पर पाया जाता है मूल (0,0) के आस-पास के दूसरे क्षणों की गणना करता है, इसलिए मुझे अक्ष के केंद्र में अक्ष को स्थानांतरित करने के लिए Parallel Axis Theorem का उपयोग करना होगा, mr^2।
केंद्र सही लग रहा है जब मैं
Point3d p = findCenterAndOrientation(src);
rectangle(src, Point(p.x-1,p.y-1), Point(p.x+1, p.y+1), Scalar(0.25), 1);
फोन लेकिन पूरी तरह से गलत जब मैं जड़ता का सबसे कम पल के साथ धुरी आकर्षित करने के लिए प्रयास करते हैं, इस समारोह का उपयोग कर, ऐसा लगता है:
line(src, (Point(p.x,p.y)-Point(100*cos(p.z), 100*sin(p.z))), (Point(p.x, p.y)+Point(100*cos(p.z), 100*sin(p.z))), Scalar(0.5), 1);
इनपुट और आउटपुट के कुछ उदाहरण यहां दिए गए हैं:
ए, बी और सी - और थेटा के लिए मूल्य क्या हैं? क्या आप उन्हें प्रिंट कर सकते हैं और खुद को समझ सकते हैं कि वे सही हैं? जब आप वस्तु को केन्द्रित करते हैं तो क्या होता है? क्या उससे मदद हुई? शुरू करने के लिए वे दो डिबगिंग कदम होंगे ... – Floris
प्रारंभिक बिंदु के लिए, आपको 'm20/m00' जैसे विभाजित होना चाहिए और घटाना नहीं चाहिए। – mmgp
ए, बी, सी आदि पर m.m00 भाग छवि मूल से ऑब्जेक्ट मूल तक रोटेशन के बिंदु को स्थानांतरित करने के लिए समानांतर अक्ष प्रमेय का उपयोग कर रहा है। – Jason