2012-12-13 11 views
6

मैं वर्तमान में स्टीरियो कैमरों की एक जोड़ी के लिए एक ओपनसीवी प्रोग्राम लिख रहा हूं। कैमरा अंशांकन के साथ ही स्टीरियो अंशांकन किया जाता है।InitUndistortRectifyMap और Remap

अगला चरण मुझे प्राप्त होने वाली 2 छवियों से स्थान में सुविधा की स्थिति ढूंढना है। यही कारण है कि मुझे स्टीरियो छवियों को सुधारना है और बाद में मेरी गणना करना है।

समस्या मैं initUndistortRectifyMap साथ सामना करना पड़ रहा

है निम्नलिखित:

-अगर मैं आर 1 या आर 2 stereoRectify()initUndistortRectifyMap() को मैं remapping के बाद काला चित्र प्राप्त द्वारा गणना गुजरती हैं।

-अगर मैं 0 (पर आर (एक खाली मैट्रिक्स) पास करता हूं तो मुझे रीमेपिंग के बाद अनुचित छवियां मिलती हैं। हालांकि मुझे मिलने वाली छवियां थोड़ी विकृत हैं।

मुझे 2 कैमरों को सुधारने के लिए आर 1, और आर 2, initUndistortRectifyMap() पास करने की आवश्यकता है, अन्यथा खाली मैट्रिक्स को पार करते समय स्टीरियो हेड एक ही विमान में घुमाए नहीं जाएंगे।

stereoRectify(intrinsic[0], distCoeffs[0], intrinsic[1], distCoeffs[1], imageSize, 
    R, T_Stereo, R1, R2, newP1, newP2, Q, CV_CALIB_ZERO_DISPARITY, -1, imageSize); 

if (x_Cam.GetSerial()=="4002678487") 
{ 
    initUndistortRectifyMap(intrinsic[0], distCoeffs[0], R1, newP1, imageSize,   
     CV_16SC2 , mapx1, mapy1); 
    remap(x_Image, imageRectified[0],mapx1, mapy1, INTER_LINEAR); 

    return imageRectified[0]; 
} 

if (x_Cam.GetSerial()=="4002702131") 
{ 
    //flip(in, in, -1); 
    initUndistortRectifyMap(intrinsic[1], distCoeffs[1], R2, newP2, imageSize, 
     CV_16SC2 , mapx2, mapy2); 
    remap(x_Image, imageRectified[1],mapx2, mapy2, INTER_LINEAR, BORDER_CONSTANT, 0); 

    return imageRectified[1]; 
} 

मैं सभी मैट्रिक्स stereoRectify() करने के लिए जा रहा मूल्यों की जाँच की और वे सही हैं:

बाद

मेरी कोड है। रोटेशन मैट्रिस आर 1, और आर 2 भी सही प्रतीत होता है। मैं सिर्फ काले छवियों को आउटपुट के रूप में प्राप्त कर रहा हूं।

मैंने प्रभाव को देखने के लिए आर 1 और आर 2 (उदाहरण के लिए आर 1 * आर 2) के लिए InitUndistortRectifyMap() में बकवास मूल्यों को पारित करने का प्रयास किया, और मुझे अजीब परिणाम मिल गए लेकिन काले छवियां नहीं मिलीं।

+2

मुझे लगता है कि आपका प्रश्न यह होगा: "क्यों initUndistortRectifyMap()' काले छवियों को वापस करता है और न केवल अजीब परिणाम? " अगली बार अपने विशिष्ट प्रश्न को स्पष्ट करने का प्रयास करें। –

+0

'initUndistortRectifyMap()' का उपयोग करने से पहले आपको कैमरे को कैलिब्रेट करने की आवश्यकता है और जाहिर है कि आप अभी तक ऐसा नहीं कर रहे हैं। कृपया उस कोड को पोस्ट करें जहां आप कैमरे को कैलिब्रेट करते हैं: http://www.aishack.in/2010/07/calibrating-undistorting-with-opencv-in-c-oh-yeah/ –

+0

एकल कैमरे को कैलिब्रेटेड के साथ-साथ दोनों स्टीरियो कैलिब्रेट() के साथ कैमरे एक साथ। मैंने स्टीरियो कैलिब्रेटाइन से आर और टी मैट्रिस की जांच की है और वे सही हैं। – user1901213

उत्तर

7

ठीक है, मैं इस तरह की समस्या के आसपास चला गया और सोचा कि मैं समाधान को साझा करता हूं जिससे कोई इसका उपयोग कर सके।

InitUndistortRectifyMap ने रोटेशन मैट्रिस आर 1 और स्टीरियोरेक्टिफ़ द्वारा उत्पादित आर 2 का उपयोग करते समय आउटपुट रिक्त छवियों का उत्पादन किया।

इसलिए, मैं OpenCV प्रलेखन के अनुसार StereoRectifyUncalibrated है, जो पैदा करता है 2 homography matrices एच 1, और एच 2, और मैं उपयोग करने के लिए गणना की रोटेशन की कोशिश की:

आर 1 = निवेश संबंधी निर्णय निर्माताओं (CamMatrix1) * एच 1 * CamMatrix1 आर 2 = आक्रमण (कैममैट्रिक्स 2) * एच 2 * कैममैट्रिक्स 2

मैंने नया आर 1, और आर 2 को InitUndistortRectifyMap में भेज दिया और रीमेप किया और परिणाम संतोषजनक हैं।

2

मैं इस पुरानी पोस्ट को खोदने जा रहा हूं क्योंकि मैंने हाल ही में इस समस्या के बारे में शोध में कुछ प्रयास किए हैं। अर्थात्, मुझे एक ही मुद्दे का सामना करना पड़ा - उचित स्टीरियो अंशांकन और सुधार (सभी ओपनसीवी प्रदान किए गए स्टीरियो दृष्टि मशीनरी) के बाद, आखिर में 'warped' छवियां काले थीं। मुझे बताएं कि ऐसा क्यों है।

सबसे पहले, कैसे रीमेप (src, dst, mapX, mapY) काम करता है। आप documentation करने के लिए जाना है, तो आप देख सकते हैं कि

enter image description here

और मूल्यों mapX (एक्स, वाई) या mapY में से एक (एक्स, वाई) src के बाहर है अगर, डीएसटी (एक्स, वाई) = 0 (काला!)। इसका मतलब है, सभी जोड़े (x, y) में मैपएक्स या मैप वाई में अमान्य मूल्य हैं। उदाहरण के लिए, मेरे मामले में, कारणों से मैं समझा नहीं सकता कि मेरे पास नक्शा नकारात्मक में सभी मूल्य हैं।

लेकिन इसका कारण यह केवल विशेष स्टेरो दृष्टि कॉन्फ़िगरेशन में होता है। मैंने कैमरों के साथ कई उदाहरण दिए हैं, इस तरह से गठबंधन किया गया था कि उनके बीच रोटेशन कोण छोटे थे (कई डिग्री तक)। उस स्थिति में, ओपनसीवी प्रक्रियाएं अच्छी तरह से काम करती हैं। 'ब्लैक' आउटपुट मुद्दे मेरे पास थे जब दो यूलर कोण समान थे और एक कोण (वाई के चारों ओर घूर्णन) 17 डिग्री था। उस मामले में, मैं कुछ प्रयोग किया जाता है - मैं mapX और mapY अनुवाद निम्नलिखित तरीके से:

for(int i=0;i<_imageSize.width;i++) 
     for(int j=0;j<_imageSize.height;j++) { 
      _mapXA.at<float>(j, i) -= 1200; 
      _mapYA.at<float>(j, i) -= 1200; 
      _mapXB.at<float>(j, i) += 2500; 
      _mapYB.at<float>(j, i) += 2500; 
     } 

(क्योंकि मैंने देखा _mapXA था बहुत बड़ी और _mapYB -1500 के आसपास ऋणात्मक मानों था)। आश्चर्यजनक रूप से, रीमेप() के बाद आउटपुट काला नहीं था। छवि बिल्कुल कुछ कोण के चारों ओर घूमने की तरह दिखती थी (17 हो सकता है, मैंने बिल्कुल जांच नहीं की थी) लेकिन इसे बिल्कुल ठीक नहीं किया गया था।

यह संभव हो सकता है कि ओपनसीवी स्टीरियो दृष्टि में गैर समांतर कैमरों को अच्छी तरह से संभाल नहीं सके। मेरा मतलब है, यह कुछ उदाहरणों के लिए काम करता है और कुछ के लिए नहीं - लेकिन इसका मतलब है कि यह विधि वास्तविक नहीं है।

एक बार फिर, यह एक कारण है कि आप बेहतर परिणाम प्राप्त करने के लिए यदि आप के रूप में के रूप में लगभग ललाट समानांतर होने के लिए अपना कैमरों की व्यवस्था करते हैं जाएगा: इसके अलावा, आप इस तरह की जानकारी गैरी ब्राद्स्की और एड्रियन केहलर लर्निंग OpenCV पा सकते हैं संभव है (कम से कम जब तक आप स्टीरियो दृष्टि पर विशेषज्ञ बनें)