2013-07-02 10 views
5

मैं कैमरे की सापेक्ष स्थिति को शतरंज (या दूसरी तरफ) में ढूंढने की कोशिश कर रहा हूं - मुझे अलग समन्वय प्रणालियों के बीच परिवर्तित करने के साथ ठीक लगता है, उदा। जैसा कि here सुझाया गया है। मैंने न केवल अंशांकन के लिए शतरंज का उपयोग करने का फैसला किया बल्कि वास्तविक स्थिति निर्धारण के साथ-साथ इस चरण में, क्योंकि (और यह ठीक काम करता है) प्राप्त करने के लिए मैं findChessboardCorners का उपयोग कर सकता हूं।ओपनसीवी: resolPnP tvec इकाइयों और अक्ष निर्देश

मैंने इस विषय पर बहुत कुछ पढ़ा है और मुझे लगता है कि मैं solvePnP आउटपुट को समझता हूं (भले ही मैं openCV और सामान्य रूप से कंप्यूटर दृष्टि से बिल्कुल नया हूं)। दुर्भाग्यवश, मुझे परिणाम solvePnP से मिलता है और परीक्षण सेट-अप को शारीरिक रूप से मापना अलग-अलग होता है: ज़ेड-दिशा में अनुवाद लगभग बंद होता है। 25%। x और y दिशानिर्देश पूरी तरह गलत हैं - कैमरे समन्वय प्रणाली (एक्स छवि को इंगित करने, दाईं ओर वाई, कैमरे से दूर जेड) की तुलना में परिमाण और विभिन्न दिशा के कई आदेश। अगर मैं tvec और rvec को विश्व निर्देशांक में कैमरा पॉज़ में परिवर्तित करता हूं तो अंतर बनी रहती है।

मेरे प्रश्न हैं:

  • का कैमरा और दुनिया समन्वय प्रणाली 'कुल्हाड़ियों दिशाओं क्या हैं?
  • solvePnP उसी इकाइयों में अनुवाद आउटपुट करता है जैसा कि मैंने objectPoints निर्दिष्ट किया है?
  • मैंने विश्व उत्पत्ति को objectPoints (शतरंज कोनों में से एक) के रूप में निर्दिष्ट किया है। क्या यह ठीक है और tvec कैमरा निर्देशांक से बिल्कुल उस बिंदु का अनुवाद है?

यह (मैं इसे अग्रिम के रूप में यह किसी भी अपवाद आदि फेंक नहीं है संलग्न) मेरे कोड है। मैंने कैलिब्रेशन के दौरान कैमरा इंट्रिनिक्स मैट्रिक्स और विकृति गुणांक प्राप्त करने के लिए ग्रेस्केल छवियों का उपयोग किया, इसलिए ग्रेस्केल में स्थानीयकरण करने का भी निर्णय लिया। chessCoordinates उत्पत्ति (कोने बिंदुओं में से एक) के संबंध में मिमी में शतरंज बिंदु स्थान की एक सूची है। camMatrix और distCoefficients अंशांकन से आते हैं (उसी शतरंज और objectPoints का उपयोग करके प्रदर्शन किया जाता है)।

camCapture=cv2.VideoCapture(0) # Take a picture of the target to get the imagePoints 
tempImg=camCapture.read() 
imgPts=[] 
tgtPts=[] 

tempImg=cv2.cvtColor(tempImg[1], cv2.COLOR_BGR2GRAY) 
found_all, corners = cv2.findChessboardCorners(tempImg, chessboardDim) 

imgPts.append(corners.reshape(-1, 2)) 
tgtPts.append(np.array(chessCoordinates, dtype=np.float32)) 

retval,myRvec,myTvec=cv2.solvePnP(objectPoints=np.array(tgtPts), imagePoints=np.array(imgPts), cameraMatrix=camMatrix, distCoeffs=distCoefficients) 

उत्तर

9

कैमरा निर्देशांक छवि निर्देशांक के समान हैं। तो आपके पास कैमरे से दाईं तरफ एक्स एक्स पॉइंटिंग है, वाई कुल्हाड़ी नीचे इशारा कर रही है, और जेड दिशा कैमरे में इंगित कर रहा है। यह एक घड़ी की कुल्हाड़ी प्रणाली है, और यह शतरंज पर लागू होगा, इसलिए यदि आपने मूल को निर्दिष्ट किया है, तो कहें, शतरंज के ऊपरी दाएं कोने में, एक्स कुल्हाड़ी दाईं तरफ दाईं तरफ जाती है और y के छोटे किनारे के साथ शतरंज, जेड कुल्हाड़ी जमीन पर नीचे की तरफ इशारा करेगा।

हल करें पीएनपी इकाइयों के रूप में उसी इकाइयों में अनुवाद आउटपुट करता है जिसमें आपने शतरंज के खेतों की लंबाई निर्दिष्ट की है, लेकिन यह कैमरा अंशांकन में निर्दिष्ट इकाइयों का भी उपयोग कर सकता है, क्योंकि यह कैमरा मैट्रिक्स का उपयोग करता है।

टीवीसी विश्व निर्देशांक की उत्पत्ति को इंगित करता है जिसमें आपने अंशांकन वस्तु रखी है। तो यदि आपने पहला ऑब्जेक्ट पॉइंट (0,0) रखा है, जहां टीवीसी इंगित करेगी।

+0

ग्रेट उत्तर, बहुत बहुत धन्यवाद। मैं कहीं पहले इस सामान में से कुछ के पास आया हूं, लेकिन कुछ आश्वासन प्राप्त करना अच्छा है। इसके अलावा, समन्वय प्रणाली अक्षों की व्याख्या बेहद उपयोगी है, क्योंकि मैं इस तरह से कुछ नहीं मिला है। चीयर्स। –

3

का कैमरा और दुनिया समन्वय प्रणाली 'कुल्हाड़ियों दिशाओं क्या हैं?

बोर्डों पर 0,0,0 कोने इतना है कि एक्स & वाई धुरी शेष कोने बिंदुओं की ओर हैं। जेड अक्ष हमेशा बोर्ड से दूर इंगित कर रहा है। इसका मतलब यह है कि यह आमतौर पर कैमरे की दिशा में कुछ हद तक इंगित करता है।

क्या हल करें पीएनपी उसी इकाइयों में अनुवाद आउटपुट करता है जैसा कि मैं ऑब्जेक्ट पॉइंट निर्दिष्ट करता हूं?

हाँ

मैं दुनिया मूल objectPoints के पहले के रूप में (बिसात कोनों में से एक) निर्दिष्ट। क्या यह ठीक है और कैमरे निर्देशांक से बिल्कुल उस बिंदु पर अनुवाद tvec है?

हां, यह बहुत आम है। ज्यादातर मामलों में, पहला कैमरा कोने 0,0,0 के रूप में सेट किया जाता है और बाद के कोनों को z = 0 विमान (जैसे; (1,0,0), (0,1,0), आदि पर सेट किया जा रहा है) ।

घुमावदार के साथ संयुक्त tvec, कैमरे की ओर बोर्ड समन्वय फ्रेम से उस बिंदु की ओर इंगित करता है। संक्षेप में; tvec & rvec आपको व्यस्त अनुवाद (विश्व -> कैमरा) प्रदान करता है। कुछ मूल ज्यामिति के साथ आप उस कैमरे को बदल सकते हैं -> दुनिया।

+0

त्वरित प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। कैमरा समन्वय प्रणाली अक्ष के बारे में क्या - वे "बिंदु" कहां करते हैं? "घूर्णन के साथ संयुक्त tvec, बोर्ड समन्वय फ्रेम ** ** कैमरे की ओर उस बिंदु की ओर इंगित करता है।" [इस] के अनुसार (http://stackoverflow.com/questions/14515200/python-opencv-solvepnp-yields-wrong-translation-vector) tvec कैमरा निर्देशांक में है ("कैमरा की ओर नहीं")। क्या यही मतलब है तुम्हारा? –

+0

मुझे लगता है (लेकिन मुझे पूरी तरह से यकीन नहीं है) कि कैमरा समन्वय प्रणाली जेड कैमरे से दूर इंगित करता है (जिस दिशा में यह "दिख रहा है")। मेरा मतलब यह है कि विश्व समन्वय फ्रेम और कैमरा समन्वय फ्रेम के बीच एक अंतर है। आप आरवीसी और टीवीसी का उपयोग कर "कैमरा फ्रेम" में "बोर्ड फ्रेम" में एक बिंदु को परिवर्तित कर सकते हैं। यदि आप कैमरे के फ्रेम से विश्व फ्रेम में एक बिंदु को कन्वर्ट करना चाहते हैं, तो आपको दोनों के विपरीत उपयोग करने की आवश्यकता है। – Nallath

+0

धन्यवाद, मैंने उपरोक्त उत्तर और आपके एक से भी बड़ी मदद से इसे पहले से ही काम कर लिया है। यह सब अब बहुत समझ में आता है। चीयर्स। –

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