2011-05-13 15 views
22

पृष्ठभूमि:सीवी :: कैलिब्रेट कैमरे से "स्वीकार्य" वापसी मूल्य क्या है?

मैं वर्तमान में एक स्टीरियो दृष्टि परियोजना OpenCV का उपयोग करने पर काम कर रहा हूँ। मैं दो संशोधित छवियों के एक सेट से एक असमानता नक्शा बनाने की कोशिश कर रहा हूं, लेकिन मुझे परिणाम मिलने की उम्मीद नहीं है। संशोधित छवियों को देखते समय, छवियों के बीच एक ध्यान देने योग्य ऊर्ध्वाधर शिफ्ट है, जो संशोधन के बाद नहीं होना चाहिए। मैं वर्तमान में यह देख रहा हूं कि त्रुटि क्या हो सकती है। मेरा कोड ओपनसीवी पुस्तक से स्टीरियो अंशांकन और पत्राचार कोड पर आधारित है, और this example। मैं ओपनसीवी के सी ++ इंटरफ़ेस का उपयोग करता हूं। मेरा ओपनसीवी संस्करण 2.1 है, उबंटू 11.04 भंडार से। सवाल का

लघु संस्करण:

क्या आरएमएस वापसी मान समारोह के लिए स्वीकार्य है:

double cv::calibrateCamera(...) 

मैं वर्तमान में ~ 20 बिसात छवि जोड़ों का एक समूह का उपयोग कर प्रत्येक कैमरे जांच। कैमरे एक दूसरे के बगल में घुड़सवार दो समान पीएस 3 आंखें (640 * 480 पिक्सेल के संकल्प के साथ) हैं। cv::calibrateCamera और (मेरे पास अलग-अलग छवि सेट के साथ अलग-अलग परिणाम हैं) के बीच एक आरएमएस त्रुटि लौटाता है। क्या यह इस छवि संकल्प के लिए एक स्वीकार्य मूल्य है या क्या मुझे बेहतर शतरंज छवियों को प्राप्त करने का प्रयास करना चाहिए?

लांग संस्करण (विवरण, कोड नमूने):

स्टीरियो दृष्टि इस्तेमाल करने के लिए; सबसे पहले, मैं यह सुनिश्चित करना चाहता हूं कि कैमरा अंशांकन दिनचर्या सही तरीके से काम करे। छवि जोड़े के एक नंबर के लिए

// Find chessboard corners 
cv::Mat left = ... //Load image 
vector<cv::Point2f> points; 

bool found = cv::findChessboardCorners(left, patternSize, points, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE); 
if(found) 
    cv::cornerSubPix(left, points, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1)); 
imagePointsLeft.push_back(points); 

मैं यह कर और imagePointsLeft और imagePointsRight में जिसके परिणामस्वरूप अंक डाल: मैं अपने स्टीरियो सेटअप ठीक करना है, तो जैसे बिसात छवियों की एक श्रृंखला का उपयोग करें। मैंने एक ही छवियों पर एक अलग कार्यक्रम में एक चेक चलाया है जहां मैं दृढ़ता से पुष्टि करता हूं कि बाएं और दाएं छवियां cv::drawChessboardCorners का उपयोग करके उसी क्रम में सभी कोनों को सही तरीके से पंजीकृत करती हैं। प्रत्येक छवि जोड़ी के लिए मैं भी एक सेट को भरने की वस्तु इतनी तरह का समन्वय करता है:

vector<cv::Point3f> obj; 
for(int i = 0; i < ny; i++) 
    for(int j = 0; j < nx; j++) 
    obj.push_back(cv::Point3f(i*squareSize,j*squareSize,0.0)); 
objectPoints.push_back(obj); 

मैं तो इन चित्रों के साथ कैमरे जांच करने का प्रयास:

double rms = cv::calibrateCamera(objectPoints, imagePointsLeft, m_imageSize, m_cameraMatrixLeft, m_distortionMatrixLeft, rvecsLeft, tvecsLeft); 

मैं इस समारोह से कैमरा intrinsics का उपयोग जब मैं ध्वज CV_CALIB_FIX_INTRINSIC का उपयोग कर cv::stereoCalibrate पर कॉल करें (प्रलेखन में स्टीरियो अंशांकन का यह तरीका सुझाया गया है, here)।

मैं कैमरे के लिए उत्तरार्द्ध, cv::stereoRectify और cv::initUndistortRectifyMap पर कॉल करने के लिए आगे बढ़ता हूं। initUndistortRectifyMap के आउटपुट का उपयोग करके संशोधित छवियों को cv::remap के साथ उत्पादित किया जाता है और एक कैमरा लाइवफ़ेड होता है। दोनों छवियों में केवल वैध पिक्सेल (कोई काला क्षेत्र नहीं) होते हैं। मेरी समस्या यह है कि किसी दिए गए पंक्ति के पिक्सेल अन्य छवि में एक ही पंक्ति से मेल नहीं खाते हैं (थोड़ा सा लंबवत ऑफ़सेट है)। इससे स्टीरियोबीएम जैसे पत्राचार एल्गोरिदम से कोई अच्छा परिणाम प्राप्त करना मुश्किल हो जाता है।

उत्तर

23

आपके कैमरे अंशांकन में कोई समस्या है: cv::calibrateCamera() रूट माध्य वर्ग (आरएमएस) पुन: प्रक्षेपण त्रुटि [1] देता है और एक अच्छी अंशांकन में 0.1 और 1.0 पिक्सेल के बीच होना चाहिए।संदर्भ के बिंदु के लिए, मुझे 640 x 480 रिज़ॉल्यूशन पर चल रहे दो हार्डवेयर-सिंक्रनाइज़ प्लेस्टेशन आई कैमरों से बने मेरे कस्टम स्टीरियो कैमरे का उपयोग करके लगभग 0.25 पीएक्स आरएमएस त्रुटि मिलती है।

क्या आप सुनिश्चित हैं कि cv::findChessboardCorners() द्वारा लौटाए गए पिक्सेल निर्देशांक obj में समान क्रम में हैं? यदि अक्षों को फिसल दिया गया था, तो आप उन लक्षणों के समान लक्षण पाएंगे जिन्हें आप वर्णन कर रहे हैं।

[1]: ओपनसीवी कैलिब्रेशन पैरामीटर के अंतिम सेट का उपयोग करके और कोनों की स्थिति की तुलना में छवि में शतरंज बिंदुओं के त्रि-आयामी को प्रक्षेपित करके पुन: प्रक्षेपण त्रुटि की गणना करता है। 300 की एक आरएमएस त्रुटि का मतलब है कि औसतन, इन अनुमानित बिंदुओं में से प्रत्येक अपनी वास्तविक स्थिति से 300 पीएक्स दूर है।

+1

त्वरित प्रतिक्रिया के लिए धन्यवाद! अब मुझे पता है कि क्या देखना है। अंशांकन छवियों को लेते समय मैं कुछ अलग सेटअप की कोशिश करूंगा। – Orka

+0

@ माइकल: क्या आपका मतलब सीवी :: कैलिब्रेट कैमरेरा() था? findChessboardCorners() एक त्रुटि मान वापस नहीं करता है। – neuviemeporte

+0

@neuviemeporte हाँ, आप बिल्कुल सही हैं। मैंने अपनी मूल पोस्ट को सही किया है। –

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