पृष्ठभूमि:सीवी :: कैलिब्रेट कैमरे से "स्वीकार्य" वापसी मूल्य क्या है?
मैं वर्तमान में एक स्टीरियो दृष्टि परियोजना 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
के साथ उत्पादित किया जाता है और एक कैमरा लाइवफ़ेड होता है। दोनों छवियों में केवल वैध पिक्सेल (कोई काला क्षेत्र नहीं) होते हैं। मेरी समस्या यह है कि किसी दिए गए पंक्ति के पिक्सेल अन्य छवि में एक ही पंक्ति से मेल नहीं खाते हैं (थोड़ा सा लंबवत ऑफ़सेट है)। इससे स्टीरियोबीएम जैसे पत्राचार एल्गोरिदम से कोई अच्छा परिणाम प्राप्त करना मुश्किल हो जाता है।
त्वरित प्रतिक्रिया के लिए धन्यवाद! अब मुझे पता है कि क्या देखना है। अंशांकन छवियों को लेते समय मैं कुछ अलग सेटअप की कोशिश करूंगा। – Orka
@ माइकल: क्या आपका मतलब सीवी :: कैलिब्रेट कैमरेरा() था? findChessboardCorners() एक त्रुटि मान वापस नहीं करता है। – neuviemeporte
@neuviemeporte हाँ, आप बिल्कुल सही हैं। मैंने अपनी मूल पोस्ट को सही किया है। –