12

मैं इन कैमरों में से प्रत्येक के दृश्य से ऑब्जेक्ट की तस्वीरों को ओपनसीवी का उपयोग करके रोटेशन मैट्रिक्स, अनुवाद वेक्टर और शायद प्रत्येक कैमरे के कुछ स्केलिंग कारकों को कैसे प्राप्त करूं? प्रत्येक तस्वीर के लिए मेरे पास कई फीचर पॉइंट्स की छवि निर्देशांक हैं। सभी चित्रों में सभी फीचर पॉइंट दिखाई नहीं दे रहे हैं। मैं दूसरी वस्तु के आकार को पहली वस्तु में संरेखित करने के लिए ऑब्जेक्ट के फीचर पॉइंट्स के गणना वाले 3 डी निर्देशांक को थोड़ा अलग ऑब्जेक्ट पर मैप करना चाहता हूं।फीचर पॉइंट्स से ओपनसीवी एक्सट्रिनिक कैमरा

मैंने सुना है यह cv::calibrateCamera(...) का उपयोग कर के लिए संभव है, लेकिन मैं काफी यह माध्यम से प्राप्त नहीं कर सकते हैं ...

कोई समस्या उस तरह के साथ अनुभव है?

+0

यह स्पष्ट नहीं है अगर आप जानते हैं 3 डी दुनिया अंक है कि आप का पालन के निर्देशांक ऊपर विभिन्न छवियों में। यदि ऐसा है, तो यह एक परिप्रेक्ष्य-एन-पॉइंट-समस्या है और आप यहां उपलब्ध ईपीएनपी एल्गोरिदम का उपयोग करके प्रत्येक कैमरे के पैरामीटर को कैलिब्रेट कर सकते हैं: http://cvlab.epfl.ch/software/EPnP/index.php। अन्यथा, नीचे मेरा जवाब देखें। – Rulle

+1

फोटोग्राफ ऑब्जेक्ट के 3 डी निर्देशांक अज्ञात हैं। –

+0

यदि ऑब्जेक्ट पर बिंदुओं के 3 डी वर्ल्ड निर्देशांक _unknown_ हैं, तो मुझे नहीं लगता कि cv :: calibrateCamera काम करेगा, क्योंकि ऐसा लगता है कि ऑब्जेक्ट पॉइंट _known_ हैं। – Rulle

उत्तर

11

मुझे ओपनसीवी में आपके जैसी समस्या के साथ सामना करना पड़ा था। मेरे पास एक स्टीरियो छवि जोड़ी थी और मैं कैमरों के बाहरी मानकों और सभी मनाए गए बिंदुओं के विश्व निर्देशांक की गणना करना चाहता था। इस समस्या का इलाज यहां किया गया है:

बेर्थोल्ड के पी। हॉर्न। सापेक्ष अभिविन्यास पुनरीक्षित। बेर्थोल्ड के पी हॉर्न। आर्टिफिशियल इंटेलिजेंस प्रयोगशाला, मैसाचुसेट्स इंस्टीट्यूट ऑफ टेक्नोलॉजी, 545 प्रौद्योगिकी ...

http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.64.4700

हालांकि, मैं इस समस्या (शायद आप एक मिल जाएगा) का एक उपयुक्त कार्यान्वयन को खोजने के लिए सक्षम नहीं था। समय सीमाओं के कारण मेरे पास इस पेपर में सभी गणित को समझने और इसे स्वयं लागू करने का समय नहीं था, इसलिए मैं एक त्वरित और गंदे समाधान के साथ आया जो मेरे लिए काम करता है। मैं समझाऊंगा कि मैंने इसे हल करने के लिए क्या किया:

मान लें कि हमारे पास दो कैमरे हैं, जहां पहले कैमरे के बाहरी पैरामीटर आरटी = मैटक्स :: आंख() हैं। अब दूसरे कैमरे के घूर्णन आर के बारे में अनुमान लगाएं। दोनों छवियों में देखी गई छवि बिंदुओं की प्रत्येक जोड़ी के लिए, हम विश्व समन्वय में उनकी संबंधित किरणों के निर्देशों की गणना करते हैं और उन्हें 2 डी-सरणी dirs में संग्रहीत करते हैं (संपादित करें: आंतरिक कैमरा पैरामीटर ज्ञात माना जाता है)। हम ऐसा इसलिए कर सकते हैं क्योंकि हम मानते हैं कि हम हर कैमरे के अभिविन्यास को जानते हैं। अब हम एक अतिरंजित रैखिक प्रणाली एसी = 0 बनाते हैं जहां सी दूसरे कैमरे का केंद्र है। मैं समारोह एक गणना करने के लिए प्रदान करते हैं:

Mat buildA(Matx<double, 3, 3> &R, Array<Vec3d, 2> dirs) 
{ 
    CV_Assert(dirs.size(0) == 2); 
    int pointCount = dirs.size(1); 
    Mat A(pointCount, 3, DataType<double>::type); 
    Vec3d *a = (Vec3d *)A.data; 
    for (int i = 0; i < pointCount; i++) 
    { 
     a[i] = dirs(0, i).cross(toVec(R*dirs(1, i))); 
     double length = norm(a[i]); 
     if (length == 0.0) 
     { 
      CV_Assert(false); 
     } 
     else 
     { 
      a[i] *= (1.0/length); 
     } 
    } 
    return A; 
} 

फिर बुला सीवी :: SVD :: solveZ (ए) आप इस प्रणाली के लिए आदर्श 1 के कम से कम वर्गों समाधान दे देंगे। इस तरह, आप दूसरे कैमरे के घूर्णन और अनुवाद प्राप्त करते हैं। हालांकि, चूंकि मैंने दूसरे कैमरे के घूर्णन के बारे में अनुमान लगाया है, इसलिए मैं इसके घूर्णन के बारे में कई अनुमान लगाता हूं (3x1 वेक्टर ओमेगा का उपयोग करके पैरामीटर किया गया है जिसमें से मैं सीवी :: रॉड्रिग्स का उपयोग करके रोटेशन मैट्रिक्स की गणना करता हूं) और फिर मैं इस अनुमान को परिष्कृत करता हूं संख्यात्मक जैकोबियन के साथ लेवेनबर्ग-मार्वार्ड ऑप्टिमाइज़र में दोबारा सिस्टम एसी = 0 को हल करना। यह मेरे लिए काम करता है लेकिन यह थोड़ा गंदा है, इसलिए यदि आपके पास समय है, तो मैं आपको कागज में जो समझाया गया है उसे लागू करने के लिए प्रोत्साहित करता हूं।

संपादित करें:

यहाँ अवशेषों की वेक्टर के मूल्यांकन के लिए Levenberg-Marquardt अनुकूलक में नियमित है:

void Stereo::eval(Mat &X, Mat &residues, Mat &weights) 
{ 

     Matx<double, 3, 3> R2Ref = getRot(X); // Map the 3x1 euler angle to a rotation matrix 
     Mat A = buildA(R2Ref, _dirs); // Compute the A matrix that measures the distance between ray pairs 
     Vec3d c; 
     Mat cMat(c, false); 
     SVD::solveZ(A, cMat); // Find the optimum camera centre of the second camera at distance 1 from the first camera 
     residues = A*cMat; // Compute the output vector whose length we are minimizing 
    weights.setTo(1.0); 
} 

वैसे, मैं इंटरनेट पर एक छोटे से अधिक खोज की है और पाया कुछ अन्य कोड जो कैमरा के बीच सापेक्ष अभिविन्यास की गणना के लिए उपयोगी हो सकते हैं। मैं अभी तक किसी भी कोड की कोशिश की है नहीं, लेकिन यह उपयोगी लगता है:

http://www9.in.tum.de/praktika/ppbv.WS02/doc/html/reference/cpp/toc_tools_stereo.html

http://lear.inrialpes.fr/people/triggs/src/

http://www.maths.lth.se/vision/downloads/

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। मुझे लगता है कि मैंने समझ लिया है कि आपने क्या लिखा और कोड किया और यह मेरी समस्या के लिए संभावित समाधान खोजने में मुझे बहुत मदद करेगा। हालांकि मुझे विश्वास है कि 'सीवी :: कैलिब्रेट कैमरा (...)' आपके द्वारा प्रस्तावित किए गए कार्यों के समान ही काम करता है। वे निम्नलिखित के रूप में एल्गोरिदम का वर्णन करते हैं: –

+0

1. सबसे पहले, यह प्रारंभिक आंतरिक पैरामीटर (विकल्प केवल प्लानर अंशांकन पैटर्न के लिए उपलब्ध है) की गणना करता है या उन्हें इनपुट पैरामीटर से पढ़ता है। विरूपण गुणांक प्रारंभ में शून्य से सेट होते हैं (जब तक कि कुछ CV_CALIB_FIX_K निर्दिष्ट नहीं होते हैं)। 2. शुरुआती कैमरा पॉज़ अनुमान लगाया गया है जैसे आंतरिक पैरामीटर पहले से ही ज्ञात हैं। यह FindExtrinsicCameraParams2 –

+0

का उपयोग करके किया जाता है। इसके बाद वैश्विक लेवेनबर्ग-मार्वार्ड ऑप्टिमाइज़ेशन एल्गोरिदम को पुन: प्रक्षेपण त्रुटि को कम करने के लिए चलाया जाता है, यानी मनाए गए फीचर पॉइंट्स के बीच स्क्वायर दूरी की कुल योग छवि बिंदुओं और अनुमानित (कैमरा पैरामीटर के लिए वर्तमान अनुमानों का उपयोग करके और poses) ऑब्जेक्ट पॉइंट ऑब्जेक्ट पॉइंट्स; ProjectPoints2 देखें। –

2

क्या ये स्थिर कैमरे जिन्हें आप स्टीरियो जोड़ी के रूप में भविष्य के उपयोग के लिए कैलिब्रेट करना चाहते हैं? इस मामले में आप cv::stereoCalibrate() फ़ंक्शन का उपयोग करना चाहेंगे। ओपनसीवी में कुछ नमूना कोड शामिल हैं, जिनमें से एक stereo_calib.cpp है जो जांच के लायक हो सकता है।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन मुझे स्टीरियो जोड़ी का उपयोग करने में कोई रूचि नहीं है। मेरे पास एक कैमरा है, जिसका प्रयोग अलग-अलग पक्षों से एक ही ऑब्जेक्ट को देखने के लिए किया जाता है। फिर प्रत्येक तस्वीर में चिह्नित फीचर पॉइंट्स को मुझे वर्चुअल ऑब्जेक्ट के संवाददाता बिंदुओं के लिए नई स्थिति की गणना करने में मदद करनी चाहिए, जिसे थोड़ा विकृत किया जाना है। वर्चुअल ऑब्जेक्ट में वास्तविक ऑब्जेक्ट के रूप में सटीक ज्यामिति होनी चाहिए जिसे फोटोग्राफ किया गया था। बीटीडब्ल्यू 'सीवी :: कैलिब्रेट कैमरे (...) 'गणना सीडी :: स्टीरियो कैलिब्रेट()' गणना गणना में उपयोग करता है। –

+0

ठीक है, क्या आपका एकल कैमरा कैलिब्रेटेड है (यानी क्या आप आंतरिक पैरामीटर जानते हैं - फोकल लम्बाई, पिक्सेल स्कू, सिद्धांत बिंदु, विरूपण गुणांक)? – Chris

+0

मैं उनका अनुमान लगा सकता हूं लेकिन वास्तविक मूल्य अज्ञात हैं। –

संबंधित मुद्दे