Contents — find the section you need

मान लीजिए कि कैमरे से ली गई किसी छवि में मानचित्र पर कई ज्ञात 3D बिंदु हैं जो मानचित्र के भीतर के बिंदुओं से मेल खाते हैं। कैमरे की स्थिति और उसकी दिशा का पता लगाना PnP (परिप्रेक्ष्य-बिंदु) कहलाता है। इसका उपयोग विज़ुअल SLAM मानचित्र ट्रैकिंग, AR में आभासी वस्तुओं को ओवरले करने, रोबोट के लिए हाथ-आँख अंशांकन और सर्वेक्षण कैमरों के लिए पोज़ अनुमान में किया जाता है।

0. 30-सेकंड का सारांश

  • इनपुट कैमरा इंट्रिंसिक मैट्रिक्स K, ज्ञात 3D बिंदु \mathbf X_i और उनके संगत छवि बिंदु \mathbf u_i हैं। आउटपुट रोटेशन R और ट्रांसलेशन t है।

  • यह प्रक्षेपण समीकरण \mathbf u_i\sim K(R\mathbf X_i+t) की पुनर्प्रक्षेपण त्रुटि को न्यूनतम करता है। 3 बिंदुओं के साथ, PnP संभावित समाधान देता है; चार या अधिक बिंदुओं के साथ, अतिरेक आपको आउटलायर्स का पता लगाने में मदद करता है।

  • EPnP प्रत्येक बिंदु को 4 आभासी नियंत्रण बिंदुओं के रैखिक संयोजन के रूप में व्यक्त करता है, जिससे कई बिंदुओं के लिए त्वरित समाधान प्राप्त होता है। इसके बाद लेवेनबर्ग-मार्क्वार्ड जैसे अंतिम अरैखिक अनुकूलन परिणाम को परिष्कृत करते हैं।

  • यदि आउटलायर्स पत्राचार में मिल जाते हैं, तो संपूर्ण पोज़ अनुमान ध्वस्त हो सकता है, इसलिए इसकी पुष्टि RANSAC-PnP, सकारात्मक-गहराई जांच और फ्रेम-दर-फ्रेम संगति के साथ की जाती है।

  • जब बिंदु लगभग समतलीय हों, लंबन कम हो, आंतरिक मान गलत हों, या दृश्य में रोलिंग शटर या गतिशील वस्तुएं हों, तो अपभ्रंश और विचलन आम हैं।

1. प्रोजेक्शन मॉडल

Diagram 1 · Use the button to switch views
PnP प्रवाह जो ज्ञात 3D बिंदुओं को एक पोज़ परिकल्पना के साथ प्रोजेक्ट करता है और RANSAC और नॉनलाइनियर रिफाइनमेंट के माध्यम से पोज़ को अपडेट करने के लिए अवशिष्टों का उपयोग करता है

चित्र 1 — मिलान ID 3D–2D पत्राचार को परिभाषित करते हैं। PnP एक पोज़ परिकल्पना बनाता है, रीप्रोजेक्शन अवशिष्ट द्वारा आउटलायर्स को अस्वीकार करता है, और R,t को परिष्कृत करता है, जो विश्व निर्देशांकों को कैमरा निर्देशांकों में मैप करता है।

कैमरा निर्देशांक फ्रेम में एक बिंदु को \mathbf X_c=R\mathbf X_w+t मान लें। पिनहोल मॉडल में, सामान्यीकृत छवि निर्देशांक हैं

x=\frac{X_c}{Z_c},\qquad y=\frac{Y_c}{Z_c}

और पिक्सेल निर्देशांक आंतरिक मैट्रिक्स के माध्यम से प्राप्त किए जाते हैं

K=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}

जैसा कि \mathbf u\sim K\mathbf X_c है। R\in SO(3) रोटेशन है और t ट्रांसलेशन है। यदि लेंस डिस्टॉर्शन है, तो प्रोजेक्शन से पहले और बाद में डिस्टॉर्शन करेक्शन आवश्यक है।

अज्ञात राशियाँ 6 डिग्री ऑफ़ फ़्रीडम हैं, जिनमें 3 रोटेशनल और 3 ट्रांसलेशनल डिग्री शामिल हैं। 3D बिंदुओं \mathbf X_i और प्रेक्षणों \mathbf u_i के बीच n पत्राचार दिए जाने पर, रीप्रोजेक्शन त्रुटि

E(R,t)=\sum_{i=1}^{n}\rho\left(\left\|\mathbf u_i-\pi(K(R\mathbf X_i+t))\right\|^2\right)

न्यूनतम की जाती है। \pi परिप्रेक्ष्य विभाजन है और \rho ह्यूबर्स जैसे एक मजबूत हानि है।

ट्रांसफ़ॉर्म को कैमरा स्थिति से भ्रमित न करें

OpenCV का solvePnP ट्रांसफ़ॉर्म के लिए rvec, tvec लौटाता है जो मैप करता है ऑब्जेक्ट/वर्ल्ड पॉइंट्स को कैमरा फ्रेम में शामिल करें। वर्ल्ड कोऑर्डिनेट्स में कैमरा सेंटर प्राप्त करने के लिए, \mathbf C_w=-R^Tt का उपयोग करें; कैमरा पोज़ के लिए, T_{cw} को इनवर्ट करके T_{wc} प्राप्त करें। tvec को ही कैमरा की वर्ल्ड पोज़िशन मान लेना एक आम गलती है। साथ ही, इनपुट इमेज पॉइंट्स को पहले ही अनडिस्टॉर्ट कर देने पर दो बार डिस्टॉर्शन लागू करने से बचें।

2. P3P, AP3P, और EPnP

P3P (पर्सपेक्टिव-3-पॉइंट), जो 3 बिंदुओं के इमेज एंगल्स और 3D बिंदुओं के बीच की दूरी का उपयोग करके कैमरा सेंटर से दूरी को रिकवर करता है, के अधिकतम 4 समाधान होते हैं। सही समाधान का चयन चौथे बिंदु या मैप के ज्ञात पोज़ के साथ तुलना करके किया जाता है। AP3P एक तेज़ वेरिएंट है जो समाधान को बीजगणितीय रूप से पुनर्गठित करता है।

जब कई बिंदु होते हैं, तो EPnP (एफिशिएंट PnP) प्रत्येक 3D बिंदु को व्यक्त करता है। 4 आभासी नियंत्रण बिंदुओं के भारित योग के रूप में।

\mathbf X_i=\sum_{j=1}^{4}\alpha_{ij}\mathbf C_j,\qquad \sum_j\alpha_{ij}=1

नियंत्रण बिंदुओं के कैमरा निर्देशांक रैखिक समीकरणों से प्राप्त किए जाते हैं, और उनसे घूर्णन और स्थानान्तरण की गणना की जाती है। क्योंकि इसकी गणना लागत बिंदुओं की संख्या के लगभग रैखिक अनुपात में होती है, इसलिए यह SLAM के कई लैंडमार्क से प्रारंभिक स्थिति बनाने के लिए उपयुक्त है। प्रारंभिक समाधान के बाद, लेवेनबर्ग-मार्क्वार्ड विधि का उपयोग करके पुनरावृत्त रूप से पुन: प्रक्षेपण त्रुटि को परिष्कृत किया जाता है।

3. RANSAC-PnP

फीचर-पॉइंट पत्राचार समान दिखने वाले पैटर्न, गतिशील वस्तुओं और गलत मानचित्र आईडी के साथ मिश्रित हो जाते हैं। मानक दृष्टिकोण RANSAC है: न्यूनतम बिंदु सेट से एक अस्थायी स्थिति बनाएं, प्रत्येक पत्राचार को पुनरावृत्त करें, और गिनें कि कितने अंतर्वर्ती एक सीमा के भीतर आते हैं। आवश्यक पुनरावृत्तियों की संख्या N, बहिर्वर्ती दर \epsilon, न्यूनतम नमूना आकार s, और सफलता की संभावना को देखते हुए। p का निर्धारण

N\ge\frac{\log(1-p)}{\log(1-(1-\epsilon)^s)}
द्वारा किया जाता है।

चूंकि आउटलायर दर के साथ आवश्यक पुनरावृति की संख्या तेजी से बढ़ती है, इसलिए फीचर-पॉइंट अनुपात परीक्षण, ग्रिड-आधारित फैलाव, या गतिशील-ऑब्जेक्ट मास्क का उपयोग करके \epsilon को पहले से कम करें। OpenCV के solvePnPRansac का उपयोग पॉइंट काउंट, फ्लैग (EPNP, P3P, SQPNP, आदि), रीप्रोजेक्शन थ्रेशोल्ड और कॉन्फिडेंस को स्पष्ट रूप से निर्दिष्ट करके किया जाता है।

4. डिजनरेसी की पहचान

समतलीय बिंदु सेट

यदि सभी 3D बिंदु एक ही समतल पर स्थित हैं, तो PnP से गहराई और स्थिति अस्पष्ट हो जाती है, और ज्यामिति को होमोग्राफी द्वारा भी समझाया जा सकता है। चेकरबोर्ड कैलिब्रेशन जानबूझकर एक समतल का उपयोग करता है, लेकिन आपको ऐसे व्यूप्वाइंट और पॉइंट लेआउट चुनने होंगे जो स्थिति की स्वतंत्रता की डिग्री को पर्याप्त रूप से सीमित करते हों। एक एकल AR मार्कर जो सीधे देखने पर अस्थिर हो जाता है गहराई भी इसी प्रकार की घटना है।

संकीर्ण छवि कवरेज और लंबी रेंज

PnP सीधे एक छवि और ज्ञात 3D बिंदुओं का उपयोग करता है, इसलिए इंटर-फ्रेम पैरेलेक्स स्वयं एक आवश्यक इनपुट नहीं है। फिर भी, यह तब खराब स्थिति में होता है जब पत्राचार केवल एक छोटे छवि क्षेत्र में होते हैं, लक्ष्य दूर होता है और छोटा दिखाई देता है, या 3D बिंदुओं में गहराई में बहुत कम भिन्नता होती है। केवल इसके इनलायर गणना के आधार पर परिणाम स्वीकार न करें: छवि कवरेज, रीप्रोजेक्शन RMSE, और पोज़ कोवेरिएंस या विक्षोभ के प्रति संवेदनशीलता का निरीक्षण करें, और आवश्यकता पड़ने पर IMU या डेप्थ सेंसर को फ्यूज करें।

अंशांकन और समय निर्धारण

फोकल लंबाई, प्रिंसिपल पॉइंट और विरूपण में त्रुटियां प्रत्येक बिंदु पर एक व्यवस्थित रीप्रोजेक्शन त्रुटि में बदल जाती हैं। एक लेंस जिसका आंतरिक मैट्रिक्स ज़ूम, तापमान या फोकस के साथ बदलता है, उसे पुनः अंशांकित करने की आवश्यकता होती है। वाहनों और ड्रोन में, यदि रोलिंग शटर का पंक्ति समय IMU के साथ सिंक्रनाइज़ नहीं है, तो PnP एक "झुकी हुई" कैमरा पोज़ लौटाएगा।

5. PnP की भूमिका विज़ुअल SLAM

विज़ुअल SLAM में, पहले से ट्रायंगुलेट किए गए मैप पॉइंट्स की संख्या बढ़ने पर, PnP का उपयोग करके कैमरे की स्थिति को फ्रेम दर फ्रेम ट्रैक किया जा सकता है। स्थिति को स्थिर रखते हुए, नए पॉइंट्स को ट्रायंगुलेट किया जाता है, और पर्याप्त कीफ्रेम जमा होने पर, बंडल एडजस्टमेंट स्थिति और मैप दोनों को संयुक्त रूप से ऑप्टिमाइज़ करता है। इसे कार्य विभाजन के रूप में समझना सबसे आसान है: PnP एक हल्का फ्रंट एंड है, और बंडल एडजस्टमेंट वैश्विक स्थिरता को संभालता है।

6. कार्यान्वयन चेकलिस्ट

  1. K और विरूपण को चेकरबोर्ड या इसी तरह के कैलिब्रेट करें, और रीप्रोजेक्शन त्रुटि को रिकॉर्ड करें।

  2. 3D पॉइंट्स की इकाइयों (m/mm) और निर्देशांक फ्रेम को इमेज पॉइंट्स की विरूपण-सुधार स्थिति के साथ संरेखित करें।

  3. अनुपात परीक्षण, पारस्परिक निकटतम पड़ोसियों और अस्थायी ट्रैकिंग के साथ पत्राचार को सीमित करें।

  4. RANSAC-PnP के साथ आउटलायर्स को हटाएँ, और इनलायर वितरण और रीप्रोजेक्शन त्रुटि को सहेजें।

  5. जांचें कि गहराई धनात्मक है, मुद्रा परिवर्तन भौतिक रूप से संभव है, और पिछले फ्रेम से अंतर उचित है।

  6. यदि स्थितियाँ अनुकूल नहीं हैं, तो IMU, गहराई, होमोग्राफी या पुनः आरंभीकरण का सहारा लें।

न्यूनतम कार्यान्वयन अनुक्रम

OpenCV के साथ, सबसे पहले solvePnPRansac से rvec, tvec, inliers प्राप्त करें, केवल इनलायर्स को solvePnPRefineLM में पास करें, और अंत में projectPoints का उपयोग करके स्वयं इनलायर RMSE और त्रुटि वितरण की गणना करें। केवल एक सफल API रिटर्न से अत्यधिक बेमेल, क्लस्टर किए गए बिंदु, या भौतिक रूप से असंभव मुद्रा का पता नहीं चलता है।

ok, rvec, tvec, inliers = cv2.solvePnPRansac(
    object_points, image_points, K, dist,
    flags=cv2.SOLVEPNP_EPNP,
    reprojectionError=3.0, confidence=0.999, iterationsCount=200,
)
if not ok or inliers is None or len(inliers) < 6:
    raise RuntimeError("PnP failed or has too few inliers")

idx = inliers.ravel()
rvec, tvec = cv2.solvePnPRefineLM(
    object_points[idx], image_points[idx], K, dist, rvec, tvec
)
projected, _ = cv2.projectPoints(object_points[idx], rvec, tvec, K, dist)
rmse = np.sqrt(np.mean(np.sum(
    (projected.reshape(-1, 2) - image_points[idx].reshape(-1, 2)) ** 2,
    axis=1,
)))
R, _ = cv2.Rodrigues(rvec)
camera_center_world = -R.T @ tvec.reshape(3, 1)

3.0 px और न ही छह इनलायर्स एक सार्वभौमिक स्वीकृति सीमा हैं; वे केवल इस उदाहरण के लिए प्रारंभिक मान हैं। छवि रिज़ॉल्यूशन, फ़ीचर परिशुद्धता और एप्लिकेशन की अनुमत मुद्रा त्रुटि से सीमाएँ प्राप्त करें। यह भी सत्यापित करें कि इनलायर्स एक ही स्थान पर क्लस्टर नहीं हैं। छवि का कोना और प्रत्येक बिंदु की कैमरा-फ्रेम गहराई Z_c>0 है।

7. सारांश

PnP एक सेतु है जो 3D मानचित्र और 2D छवि के बीच पत्राचार को 6 डिग्री स्वतंत्रता के साथ कैमरा पोज़ में परिवर्तित करता है। P3P/EPnP के साथ एक प्रारंभिक समाधान बनाएं, RANSAC के साथ आउटलायर्स को हटाएँ, और गैर-रेखीय अनुकूलन के साथ परिष्कृत करें। केवल बिंदु लेआउट, अंशांकन, लंबन और समय सिंक्रनाइज़ेशन को एक साथ प्रबंधित करके ही यह विज़ुअल SLAM या AR के लिए एक स्थिर पोज़ अनुमान बन सकता है।

अपनी समझ की जाँच करें
क्या PnP को केवल दो छवियों की आवश्यकता होती है?

इसके मूल इनपुट ज्ञात 3D बिंदु, उनके 2D छवि पत्राचार और कैमरा इंट्रिंसिक्स हैं। यह 2D-से-2D गति का अनुमान लगाने से भिन्न है। मिलान।

संदर्भ

What to read next

Review the backgroundएपिपोलर ज्योमेट्री — दो छवियों से गहराई और कैमरा गति का अध्ययनContinue the seriesस्ट्रक्चर फ्रॉम मोशन प्राइमर — अव्यवस्थित तस्वीरों के सेट से 3D और कैमरा पोजीशन को एक साथ पुनर्प्राप्त करनाExplore another aspect of this fieldछवि चमक और ल्यूमिनेंस Lab — एक्सपोज़र, गामा और क्लिपिंग