Contents — find the section you need
विज़ुअल SLAM, विज़ुअल ओडोमेट्री, एपिपोलर ज्योमेट्री और PnP (पिक्सेल निर्देशांकों से 3D स्पेस में सटीक मैपिंग) सभी मानकर चलते हैं। लेकिन लेंस से गुजरने वाला प्रकाश कभी भी उस तरह से छवि नहीं बनाता जिस तरह से एक आदर्श पिनहोल लेंस बनाता है। पिक्सेल इकाइयों में फोकल लंबाई क्या है? मुख्य बिंदु छवि केंद्र से कितनी दूरी पर है? छवि पर एक सीधी रेखा कितनी झुकती है? कैमरा कैलिब्रेशन इन मात्राओं को संख्यात्मक रूप से हल करने की प्रक्रिया है। कैलिब्रेशन में लापरवाही करने पर, चाहे SLAM या SfM एल्गोरिदम कितना भी परिष्कृत क्यों न हो, एक व्यवस्थित त्रुटि मूल आधार से ही फैलती रहती है।
0.30-सेकंड का सारांश
-
कैमरा कैलिब्रेशन एक ऐसी प्रक्रिया है जिसमें 3D बिंदुओं और छवि बिंदुओं के बीच ज्ञात पत्राचारों से आंतरिक मापदंडों (फोकल लंबाई, प्रमुख बिंदु, तिरछापन) और विरूपण गुणांकों का अनुमान लगाया जाता है। बाह्य मापदंड (प्रत्येक शॉट पर कैमरे की स्थिति) भी साथ ही प्राप्त किए जाते हैं।
-
लेंस में रेडियल और स्पर्शरेखीय दोनों प्रकार के ज्यामितीय विरूपण होते हैं। मानक निरूपण ब्राउन-कॉनराडी मॉडल है, जो रेडियल विरूपण को k_1,k_2,k_3 और स्पर्शरेखीय विरूपण को p_1,p_2 के रूप में व्यक्त करता है। वाइड-एंगल और फिशआई लेंस के लिए एक अलग मॉडल की आवश्यकता होती है।
-
झांग की विधि - एक समतल पैटर्न (जैसे चेकरबोर्ड) को कई स्थितियों से शूट करना, प्रत्येक दृश्य के होमोग्राफी से आंतरिक मापदंडों को रैखिक रूप से हल करना, और फिर अरैखिक अनुकूलन के माध्यम से विरूपण सहित परिष्करण करना - व्यवहार में मानक कैलिब्रेशन विधि है।
-
कैलिब्रेशन की गुणवत्ता का आकलन रीप्रोजेक्शन त्रुटि द्वारा किया जाता है। केवल औसत मान देखना पर्याप्त नहीं है — आपको छवि के भीतर त्रुटि के स्थानिक वितरण और विभिन्न मुद्राओं में भिन्नता की भी जाँच करनी होगी, अन्यथा आप उन स्थानीय विकृतियों को नज़रअंदाज़ कर देंगे जिन्हें पूरी तरह से कैप्चर नहीं किया गया था।
कैलिब्रेशन एक स्थिर, हमेशा के लिए मान्य प्रणाली नहीं है। ज़ूम, फ़ोकस, तापमान, झटका और रिज़ॉल्यूशन या क्रॉपिंग में परिवर्तन से आंतरिक पैरामीटर बदल सकते हैं। इस धारणा के टूटने पर विज़ुअल SLAM, VO और PnP की कार्यक्षमता धीरे-धीरे कम हो जाती है।
1. निर्देशांकों से पिनहोल मॉडल का पुनरावलोकन
पिनहोल मॉडल में, विश्व-निर्देशांक बिंदु \mathbf{X}=(X,Y,Z,1)^\mathsf{T} (समरूप निर्देशांक) को छवि पर पैमाने के अनुसार प्रक्षेपित किया जाता है:
R\in SO(3) और \mathbf{t} विश्व निर्देशांकों से कैमरा निर्देशांकों तक घूर्णन और स्थानान्तरण (बाह्य पैरामीटर) हैं, और K आंतरिक मैट्रिक्स है।
यहाँ f_x,f_y पिक्सेल इकाइयों में फोकल लंबाई हैं, (c_x,c_y) मुख्य बिंदु (जहाँ प्रकाशीय अक्ष छवि तल को काटता है) है, और s तिरछापन (अधिकांश आधुनिक सेंसरों पर लगभग शून्य) है। कैलिब्रेशन, विशुद्ध रूप से प्रेक्षित डेटा से इस K , विरूपण गुणांकों और प्रत्येक शॉट के R,\mathbf{t} को पुनर्प्राप्त करने की व्युत्क्रम समस्या है।
जैसा कि आरेख में दिखाया गया है, केवल एक शॉट से आंतरिक मापदंडों को बाहरी मापदंडों से अलग नहीं किया जा सकता है। अलग-अलग स्थितियों (झुकाव, दूरी) पर कई अवलोकन एकत्र करके ही K को लगभग विशिष्ट रूप से निर्धारित किया जा सकता है - और यही झांग की विधि का मूल विचार है, जिसकी चर्चा आगे की जाएगी।
2. लेंस एक आदर्श पिनहोल नहीं है: विरूपण मॉडल
वास्तविक लेंस में रेडियल विरूपण और स्पर्शरेखीय विरूपण होता है। मानकीकृत छवि निर्देशांक को (x,y)=(X_c/Z_c,\,Y_c/Z_c) और त्रिज्या को r^2=x^2+y^2 के रूप में लिखने पर, ब्राउन-कॉनराडी विरूपण मॉडल को इस प्रकार लिखा जा सकता है।
k_1,k_2,k_3 रेडियल विरूपण गुणांक हैं, और p_1,p_2 स्पर्शरेखीय विरूपण गुणांक हैं। रेडियल विरूपण एक ऐसी घटना है जिसमें लेंस के केंद्र से दूरी के आधार पर छवि सिकुड़ती या फैलती है, जो वाइड-एंगल लेंस के साथ दिखाई देने वाले स्पष्ट "बैरल" विरूपण या टेलीफोटो लेंस के साथ दिखाई देने वाले "पिनकुशन" विरूपण के रूप में प्रकट होती है। स्पर्शरेखीय विरूपण एक छोटा, असममित घटक है जो कार्यान्वयन की खामियों से उत्पन्न होता है जहां लेंस समूह और छवि सेंसर पूरी तरह से समानांतर नहीं होते हैं। अंतिम पिक्सेल निर्देशांक \tilde{\mathbf{x}}_{px}=K(x_d,y_d,1)^\mathsf{T} के रूप में प्राप्त किए जाते हैं।
फिशआई लेंस जैसे अत्यधिक विस्तृत दृश्य क्षेत्र वाले लेंसों के लिए, ब्राउन-कॉनराडी बहुपद मॉडल किनारों के पास विचलन करने लगता है और व्यावहारिक नहीं है। इसके बजाय, कोण-आधारित समदूरस्थ-प्रक्षेपण सन्निकटन का उपयोग करना आम बात है, जैसे कि OpenCV का फिशआई मॉडल। किसी एक विरूपण मॉडल को "याद रखने" के बजाय, यह ध्यान रखना महत्वपूर्ण है कि मॉडल का चयन लेंस के दृश्य क्षेत्र और ऑप्टिकल डिज़ाइन के आधार पर किया जाना चाहिए।
3. झांग की विधि: समतल पैटर्न के साथ अंशांकन
आजकल सबसे व्यापक रूप से उपयोग की जाने वाली विधि, झांग द्वारा 2000 में प्रकाशित समतल पैटर्न अंशांकन विधि है। इसके लिए किसी विशेष 3D अंशांकन उपकरण की आवश्यकता नहीं होती है — बस एक समतल पैटर्न, जैसे कि मुद्रित चेकरबोर्ड, को कई स्थितियों से फोटो खींचना होता है, जिसमें कैमरा या पैटर्न को ही गतिमान रखा जाता है।
किसी स्थिति i पर पैटर्न तल (Z=0 लेते हुए) से छवि तक की मैपिंग को रोटेशन मैट्रिक्स के पहले और दूसरे कॉलम \mathbf{r}_1,\mathbf{r}_2 और ट्रांसलेशन \mathbf{t} का उपयोग करके होमोग्राफी के रूप में लिखा जा सकता है।
यहाँ, प्रत्येक पोज़ के H_i का अनुमान पैटर्न पर ज्ञात ग्रिड बिंदुओं और उनके छवि पत्राचारों से रैखिक रूप से लगाया जा सकता है, होमोग्राफी प्राइमर में वर्णित DLT विधि का उपयोग करके। रोटेशन मैट्रिक्स के स्तंभों के ऑर्थोनॉर्मल होने की बाधा का उपयोग करते हुए — \mathbf{r}_1^\mathsf{T}\mathbf{r}_2=0,\ \|\mathbf{r}_1\|=\|\mathbf{r}_2\| — B=K^{-\mathsf{T}}K^{-1} में एक रैखिक समीकरण प्राप्त होता है:
जो प्रति पोज़ दो ऐसे समीकरण देता है ( \mathbf{h}_1,\mathbf{h}_2 क्रमशः H_i के पहले और दूसरे स्तंभ हैं)। चूंकि B एक सममित मैट्रिक्स है जिसमें 6 डिग्री ऑफ़ फ़्रीडम हैं, इसलिए 3 या अधिक पोज़ दिए जाने पर, B को लीनियर लीस्ट स्क्वेयर्स विधि द्वारा ज्ञात किया जा सकता है, और फिर K को चोल्स्की डीकंपोज़िशन के समतुल्य प्रक्रिया द्वारा बंद रूप में ज्ञात किया जा सकता है। यही कारण है कि झांग की विधि में केवल "एक समतल के कुछ शॉट्स" की आवश्यकता होती है। हालांकि, यदि सभी पोज़ लगभग इमेज प्लेन के समानांतर (फ्रंटो-पैरेलल) हैं, तो समीकरण विकृत हो जाते हैं, इसलिए कई अलग-अलग झुकावों पर पोज़ की आवश्यकता होती है।
बंद रूप समाधान केवल एक प्रारंभिक मान है जो विरूपण को अनदेखा करता है। यहां से, व्यवहार में मानक दो-चरणीय दृष्टिकोण अगले खंड में वर्णित रीप्रोजेक्शन त्रुटि को उद्देश्य फ़ंक्शन के रूप में उपयोग करके, नॉन-लीनियर ऑप्टिमाइजेशन (आमतौर पर लेवेनबर्ग-मार्क्वार्ड) के माध्यम से विरूपण गुणांक सहित सभी मापदंडों को परिष्कृत करता है।
4. पुनर्प्रक्षेपण त्रुटि और पैरामीटर अनुकूलन
कैलिब्रेशन का उद्देश्य प्रत्येक पोज़ और प्रत्येक ग्रिड बिंदु पर, प्रेक्षित पिक्सेल और अनुमानित पैरामीटरों के साथ परिकलित प्रक्षेपित स्थिति के बीच के अंतर को न्यूनतम करना है। पोज़ i पर प्रेक्षण, बिंदु j को \mathbf{u}_{ij} के रूप में और समतल पर संबंधित ज्ञात 3D बिंदु को \mathbf{X}_j के रूप में लिखने पर,
वह मान है जिसे न्यूनतम किया जाता है। \boldsymbol{\kappa}=(k_1,k_2,k_3,p_1,p_2) विरूपण गुणांक सदिश है, और \pi_d विरूपण सहित प्रक्षेपण फलन है। अज्ञात राशियाँ बड़ी हैं — K (4–5 डिग्री ऑफ़ फ़्रीडम), \boldsymbol{\kappa} (3–5 डिग्री ऑफ़ फ़्रीडम), और R_i,\mathbf{t}_i प्रति पोज़ (6 डिग्री ऑफ़ फ़्रीडम × पोज़ की संख्या) — लेकिन पर्याप्त प्रेक्षित बिंदुओं के साथ, समस्या अच्छी तरह से नियंत्रित होती है। इस सूत्र को बंडल एडजस्टमेंट प्राइमर में वर्णित "कैमरा पोज़ और 3D संरचना को संयुक्त रूप से अनुकूलित करना" फ्रेमवर्क के एक विशेष मामले के रूप में देखा जा सकता है। क्योंकि कैलिब्रेशन में 3D-बिंदु निर्देशांक ज्ञात और स्थिर होते हैं, यह सामान्य बंडल एडजस्टमेंट की तुलना में एक आसान उपसमस्या है।
पुनःप्रक्षेपण त्रुटि \left\|\mathbf{u}_{ij}-\hat{\mathbf{u}}_{ij}\right\| के रूट मीन स्क्वायर (RMS) को "कैलिब्रेशन सटीकता" के रूप में रिपोर्ट करना आम बात है, लेकिन केवल औसत मान को देखकर कैलिब्रेशन को पूर्ण घोषित करना जोखिम भरा है। निम्नलिखित बिंदुओं की भी हमेशा जाँच करें:
- क्या प्रत्येक पोज़ की औसत त्रुटि में भिन्नता है (किसी विशिष्ट कोण पर अत्यधिक त्रुटि वाला पोज़ पैटर्न विरूपण, मोशन ब्लर या असमान प्रकाश का संकेत देता है)
- छवि के भीतर त्रुटि का स्थानिक वितरण (किनारों पर व्यवस्थित त्रुटि का बने रहना यह दर्शाता है कि विरूपण मॉडल का क्रम या प्रकार अपर्याप्त हो सकता है)
- ग्रिड-पॉइंट डिटेक्शन की सब-पिक्सेल सटीकता (यदि कॉर्नर डिटेक्शन ही अस्थिर है, तो किसी भी प्रकार का ऑप्टिमाइज़ेशन इसे मॉडल त्रुटि से अलग नहीं कर सकता)
5. OpenCV में स्केलेटन का कार्यान्वयन
एकल-कैमरा कैलिब्रेशन की सामान्य प्रक्रिया इस प्रकार है। शूटिंग की स्थितियों (रिज़ॉल्यूशन, ज़ूम, फ़ोकस) को स्थिर करना और छवि के चारों कोनों, केंद्र और विभिन्न झुकावों पर पैटर्न की फ़ोटो खींचना, एक अच्छे कैलिब्रेशन का 90% हिस्सा होता है।
import cv2 as cv
import numpy as np
pattern_size = (9, 6) # number of internal corners
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
objp *= square_size_m # measured side length of one square [m]
obj_points, img_points = [], []
for gray in calibration_images: # multiple frames shot at different poses
found, corners = cv.findChessboardCorners(gray, pattern_size)
if found:
corners = cv.cornerSubPix(gray, corners, (11, 11), (-1, -1),
(cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001))
obj_points.append(objp)
img_points.append(corners)
ret, K, dist, rvecs, tvecs = cv.calibrateCamera(
obj_points, img_points, gray.shape[::-1], None, None)
# ret is the RMS reprojection error [px]. Also compute per-pose error separately to check.
वाइड-एंगल या फ़िशआई लेंस के लिए, सामान्य calibrateCamera के बजाय cv.fisheye.calibrate API परिवार का उपयोग करें। स्टीरियो रिग के लिए, दोनों कैमरों के आंतरिक मापदंडों के अलावा सापेक्ष स्थिति ज्ञात करने के लिए cv.stereoCalibrate का उपयोग करें, और बाएँ और दाएँ छवियों को क्षैतिज उपध्रुवीय रेखाओं के साथ संरेखित करने के लिए cv.stereoRectify का उपयोग करें। यह प्रक्रिया सीधे स्टीरियो कैमरे कैसे काम करते हैं और डेप्थ कैमरे कैसे काम करते हैं में वर्णित आधारभूत डिज़ाइन से जुड़ी है।
6. कैलिब्रेशन ड्रिफ्ट डाउनस्ट्रीम सिस्टम को क्यों बाधित करता है
विजुअल SLAM, VO और PnP में अधिकांश गणितीय गणना इस धारणा पर आधारित है कि शूटिंग की स्थितियाँ न बदलने पर कैलिब्रेशन मान स्थिर रहते हैं। एपिपोलर ज्योमेट्री प्राइमर में आवश्यक मैट्रिक्स अनुमान के लिए सामान्यीकृत निर्देशांक K^{-1}\tilde{\mathbf{x}} माने जाते हैं; पीएनपी प्राइमर में रीप्रोजेक्शन त्रुटि न्यूनीकरण के लिए भी K को ज्ञात माना जाता है। यदि K या विरूपण गुणांक वास्तविक ऑप्टिकल सिस्टम से मेल नहीं खाते हैं, तो ये सभी गणनाएँ प्रभावी रूप से "गलत पैमाने" से की जा रही हैं।
विशेष रूप से, अंशांकन मान निम्न कारणों से धीरे-धीरे कम हो जाते हैं:
-
ज़ूम/फोकस में परिवर्तन: फोकल लंबाई बदलने वाले लेंस के साथ, f_x,f_y प्रत्येक शॉट में बदल जाते हैं। ऑटोफोकस को संचालित करने की अनुमति देने का अर्थ है कि अंशांकन के समय और रनटाइम पर आंतरिक पैरामीटर मेल नहीं खाएंगे।
-
तापमान और यांत्रिक झटके: लेंस बैरल या सेंसर माउंटिंग में मामूली स्थिति परिवर्तन से प्रिंसिपल पॉइंट और डिस्टॉर्शन गुणांक बदल जाते हैं। आउटडोर, ऑटोमोटिव और ड्रोन अनुप्रयोगों के लिए यह विशेष रूप से महत्वपूर्ण है।
-
रिज़ॉल्यूशन, क्रॉपिंग या डिजिटल ज़ूम में परिवर्तन: चूंकि K एक पिक्सेल-यूनिट पैरामीटर है, इसलिए यदि छवि का आकार बदला जाता है या उसे क्रॉप किया जाता है, तो f_x,f_y,c_x,c_y को भी स्केल के अनुसार अपडेट किया जाना चाहिए। इसे भूल जाना एक बहुत ही आम गलती है।
-
बाएं/दाएं कैमरा रिग का विरूपण: स्टीरियो सेटअप में, यदि सापेक्ष स्थिति (बाह्य अंशांकन) - न केवल आंतरिक पैरामीटर - समय के साथ थोड़ा सा बदल जाती है, तो असमानता से गणना की गई गहराई पर एक व्यवस्थित त्रुटि आ जाती है।
एकल, पृथक स्थिति अनुमान में इन त्रुटियों को पहचानना मुश्किल है। लेकिन VO या SLAM जैसी प्रणालियों में, जो समय के साथ क्रमिक रूप से पोज़ को एकीकृत करती हैं, व्यवस्थित रीप्रोजेक्शन त्रुटि ड्रिफ्ट के रूप में जमा हो जाती है, जिससे एक विकृत मानचित्र बनता है जिसे लूप क्लोज़र पूरी तरह से ठीक नहीं कर सकता। उत्पादन प्रणालियों में, निश्चित, ज्ञात 3D विशेषताओं (किसी इमारत पर सीधी रेखाएँ, ज्ञात आकार के संकेत) का उपयोग करके कैलिब्रेशन ड्रिफ्ट की ऑनलाइन निगरानी करना या आवधिक रीकैलिब्रेशन की एक नियमित प्रक्रिया बनाना उचित है।
7. सामान्य विफलताएँ और निवारण उपाय
| विफलता पैटर्न | क्या होता है | निवारण उपाय |
|---|---|---|
| अपर्याप्त पोज़ विविधता (केवल सामने से लिए गए शॉट) | K और विरूपण का निर्धारण ठीक से नहीं हो पाता, विशेष रूप से k_3 और मुख्य बिंदु | छवि के चारों कोनों, केंद्र और कई अलग-अलग झुकाव कोणों पर शूट करें |
पैटर्न समतल सतह से हटकर विकृत हो जाता है | अंशांकन का मूल सिद्धांत ही विफल हो जाता है, जिससे एक व्यवस्थित त्रुटि पूरे चित्र में फैल जाती है | इसे एक कठोर समतल पैनल पर लगाएं; भौतिक माप द्वारा मुद्रण पैमाने की त्रुटियों को ठीक करें |
कोनों का पता लगाने की सटीकता कम है | मॉडल की अभिव्यंजक क्षमता की परवाह किए बिना पुनर्प्रक्षेपण त्रुटि का स्तर बढ़ जाता है | सब-पिक्सेल सुधार, पर्याप्त रिज़ॉल्यूशन, फ़ोकस और एक्सपोज़र का प्रबंधन |
वाइड-एंगल लेंस पर एक साधारण पिनहोल विरूपण मॉडल लागू करना | छवि किनारों पर अपसारी त्रुटि, अस्थिर अनुकूलन | दृश्य क्षेत्र के अनुरूप एक मॉडल चुनें, जैसे कि फिशआई मॉडल |
आकार बदलने/क्रॉप करने के बाद K अपडेट नहीं होता | मुख्य बिंदु और फोकल लंबाई पैमाने के साथ तालमेल से बाहर हो जाते हैं, जिससे पोज़ अनुमान में व्यवस्थित त्रुटि होती है | प्रत्येक छवि रूपांतरण पर K को संबंधित पैमाने में परिवर्तित करें |
रोलिंग शटर को अनदेखा करना | वास्तविक प्रक्षेपण केंद्र पंक्ति दर पंक्ति भिन्न होता है, यहाँ तक कि एक ही फ्रेम के भीतर भी | वैश्विक शटर का उपयोग करें, या पंक्ति-समय मॉडल से सुधार करें |
8. सारांश
कैमरा अंशांकन वह पहला चरण है जो किसी छवि को "केवल एक 2D सरणी" से "ज्यामितीय रूप से व्याख्या योग्य अवलोकन" में परिवर्तित करता है। पिनहोल मॉडल के आंतरिक और बाह्य मापदंड, साथ ही रेडियल और स्पर्शरेखीय विरूपण गुणांक, कई स्थितियों में किए गए अवलोकनों से प्राप्त किए जाते हैं — जैसा कि झांग की समतल-पैटर्न विधि में होता है — और पुनर्प्रक्षेपण त्रुटि के अरैखिक अनुकूलन के साथ इसे पूरा किया जाता है। इस अंशांकन की गुणवत्ता किसी भी एल्गोरिदम के स्वयं के सटीकता मापक में नहीं दिखती है, लेकिन यह प्रत्येक चरण में प्रत्येक समीकरण का आधार है — एपिपोलर ज्यामिति, PnP, विज़ुअल SLAM, SfM, बंडल समायोजन। अंशांकन एक बार की प्रक्रिया नहीं है — यह एक ऐसी प्रक्रिया का हिस्सा है जिसकी शूटिंग की स्थितियों में परिवर्तन के साथ लगातार निगरानी की जानी चाहिए।
क्या एक कैलिब्रेशन छवि पर एक छोटी सी त्रुटि पर्याप्त है?
फिट उस दृष्टिकोण का समर्थन कर सकता है।
विभिन्न झुकावों, छवि किनारों और अलग-अलग सत्यापन छवियों की जाँच करें। ## संदर्भ - [झांग, कैमरा कैलिब्रेशन के लिए एक लचीली नई तकनीक (IEEE TPAMI, 2000)](https://doi.org/10.1109/34.888718) - [हेइक्किला और सिल्वेन, अंतर्निहित छवि सुधार के साथ एक चार-चरणीय कैमरा कैलिब्रेशन प्रक्रिया (CVPR 1997)](https://dl.acm.org/doi/10.5555/794189.794489) - [हार्टले और ज़िसरमैन, कंप्यूटर विज़न में मल्टीपल व्यू ज्योमेट्री (लेखकों का आधिकारिक पृष्ठ)](https://www.robots.ox.ac.uk/~vgg/hzbook/) - [OpenCV — कैमरा कैलिब्रेशन और 3D पुनर्निर्माण](https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html) - [OpenCV — कैमरा कैलिब्रेशन ट्यूटोरियल](https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html) - [OpenCV — फिशआई कैलिब्रेशन मॉड्यूल]( [कैलिबर (कैमरा/आईएमयू कैलिब्रेशन टूल, आधिकारिक रिपॉजिटरी)](https://docs.opencv.org/4.x/db/d58/group__calib3d__fisheye.html) - [कैलिबर (कैमरा/आईएमयू कैलिब्रेशन टूल, आधिकारिक रिपॉजिटरी)](https://github.com/ethz-asl/kalibr)
टिप्पणियाँ
पहले लॉग इन करें।
अभी कोई डेटा नहीं है।