2015-12-16 4 views
8

मैं हाल ही में OpenCV 3.0 के साथ काम शुरू कर दिया है और मेरा लक्ष्य स्टीरियो कैमरों का एक सेट से स्टीरियो छवियों की एक जोड़ी पर कब्जा करने की है, बनाने के स्टीरियो छवियों की एक जोड़ी की एक वैध बिंदु बादल प्रतिनिधित्व उत्पन्न करने के लिए एक उचित असमानता नक्शे, एक 3 डी बिंदु बादल को असमानता नक्शा बदलने और अंत में पीसीएल का उपयोग कर एक बिंदु बादल दर्शक में जिसके परिणामस्वरूप बिंदु बादल दिखाते हैं।कैसे OpenCV 3.0 का उपयोग कर StereoSGBM और पीसीएल

मैं पहले से ही कैमरा अंशांकन प्रदर्शन किया है और जिसके परिणामस्वरूप अंशांकन आरएमएस 0.4

है आप मेरी छवि जोड़े (बाएं छवि) 1 और (सही छवि) नीचे दिए गए लिंक में 2 पा सकते हैं। मैं असमानता छवि बनाने के लिए स्टीरियोएसबीबीएम का उपयोग कर रहा हूं। मैं बेहतर असमानता छवि प्राप्त करने के लिए स्टीरियोएसबीबीएम फ़ंक्शन पैरामीटर समायोजित करने के लिए ट्रैक-बार का भी उपयोग कर रहा हूं। दुर्भाग्य से मैं अपनी असमानता छवि पोस्ट नहीं कर सकता क्योंकि मैं स्टैक ओवरफ्लो में नया हूं और दो से अधिक छवि लिंक पोस्ट करने के लिए पर्याप्त प्रतिष्ठा नहीं है!

असमानता छवि (नीचे दिए गए कोड में "disp") प्राप्त करने के बाद, मैं असमानता छवि जानकारी XYZ 3 डी समन्वय में परिवर्तित करने के लिए reprojectImageTo3D() फ़ंक्शन का उपयोग करता हूं, और फिर मैं परिणामों को "pcl: : PointXYZRGB "अंक ताकि वे पीसीएल पॉइंट क्लाउड व्यूअर में दिखाए जा सकें। आवश्यक रूपांतरण करने के बाद, मुझे पॉइंट क्लाउड के रूप में जो मिलता है वह एक मूर्ख पिरामिड आकार बिंदु-बादल है जो कोई समझ नहीं लेता है। मैंने पहले से ही निम्नलिखित लिंक में सुझाए गए सभी तरीकों को पढ़ लिया है और कोशिश की है:

1- http: //blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html

2- http: //stackoverflow.com/questions/13463476/opencv-stereorectifyuncalibrated-to-3d-point-cloud

3- http: //stackoverflow.com/questions/22418846/reprojectimageto3d-in- opencv

और उनमें से गैर काम किया !!!

नीचे मैं अपने कोड के रूपांतरण भाग प्रदान की है, यह बहुत सराहना की जाएगी क्या आप मुझे बता सकता है अगर मैं क्या याद आ रही है: कुछ काम और कुछ शोध मैंने पाया मेरा उत्तर और मैं कर रहा हूँ करने के बाद

pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointcloud(new pcl::PointCloud<pcl::PointXYZRGB>()); 
    Mat xyz; 
    reprojectImageTo3D(disp, xyz, Q, false, CV_32F); 
    pointcloud->width = static_cast<uint32_t>(disp.cols); 
    pointcloud->height = static_cast<uint32_t>(disp.rows); 
    pointcloud->is_dense = false; 
    pcl::PointXYZRGB point; 
    for (int i = 0; i < disp.rows; ++i) 
     { 
      uchar* rgb_ptr = Frame_RGBRight.ptr<uchar>(i); 
      uchar* disp_ptr = disp.ptr<uchar>(i); 
      double* xyz_ptr = xyz.ptr<double>(i); 

      for (int j = 0; j < disp.cols; ++j) 
      { 
       uchar d = disp_ptr[j]; 
       if (d == 0) continue; 
       Point3f p = xyz.at<Point3f>(i, j); 

       point.z = p.z; // I have also tried p.z/16 
       point.x = p.x; 
       point.y = p.y; 

       point.b = rgb_ptr[3 * j]; 
       point.g = rgb_ptr[3 * j + 1]; 
       point.r = rgb_ptr[3 * j + 2]; 
       pointcloud->points.push_back(point); 
      } 
     } 
    viewer.showCloud(pointcloud); 
+0

कृपया आपके द्वारा प्रदान की गई छवियों की जांच करें, वे वही – alexisrozhkov

+0

क्षमा करें, मेरा बुरा। मैंने सही फ्रेम अपलोड किए हैं! –

उत्तर

11

इसे यहां साझा करना ताकि अन्य पाठक इसका उपयोग कर सकें।

असमानता छवि से 3 डी XYZ (और अंत में एक बिंदु क्लाउड) में रूपांतरण एल्गोरिदम के साथ कुछ भी गलत नहीं था। समस्या वस्तुओं की दूरी थी कैमरों और जानकारी की मात्रा है कि StereoBM या StereoSGBM एल्गोरिदम दो छवियों (छवि जोड़ी) के बीच समानता का पता लगाने के लिए उपलब्ध था करने के लिए (है कि मैं की तस्वीरें लेने गया था)। उचित 3 डी पॉइंट क्लाउड प्राप्त करने के लिए इसमें एक अच्छी असमानता छवि होनी चाहिए और एक अच्छी असमानता छवि (मान लीजिए कि आपने अच्छी अंशांकन किया है) सुनिश्चित करने के लिए:

1- पर्याप्त होना चाहिए पता लगाने योग्य और अलग-अलग सामान्य विशेषताएं दो फ्रेम (दाएं और बाएं फ्रेम) के बीच उपलब्ध हैं। कारण किया जा रहा है कि StereoBM या StereoSGBM एल्गोरिदम दो फ्रेम के बीच आम सुविधाओं के लिए देखो और वे आसानी से दो फ्रेम जो जरूरी ही वस्तुओं से संबंधित नहीं कर सकते हैं में इसी तरह की बातों से मूर्ख बनाया जा सकता है। मुझे व्यक्तिगत रूप से लगता है कि इन दो मिलान करने वाले एल्गोरिदम में सुधार के लिए बहुत सारे कमरे हैं। तो अपने कैमरे के साथ जो कुछ आप देख रहे हैं उससे सावधान रहें।

2- रुचि के ऑब्जेक्ट्स (जिन्हें आप अपना 3 डी पॉइंट क्लाउड मॉडल रखना चाहते हैं) आपके कैमरों के लिए एक निश्चित दूरी के भीतर होना चाहिए। आधार रेखा जितनी बड़ी होगी (आधार रेखा दो कैमरों के बीच की दूरी है), आगे की आपकी रुचि (लक्ष्य) हो सकती है।

एक शोर और विकृत असमानता छवि कभी भी एक अच्छा 3 डी पॉइंट क्लाउड उत्पन्न नहीं करती है। अपनी असमानता छवियों को बेहतर बनाने के लिए आप एक चीज कर सकते हैं, अपने अनुप्रयोगों में ट्रैक-बार का उपयोग करना ताकि आप स्टीरियोएसबीएम या स्टीरियोएसबीबीएम पैरामीटर को एडजस्ट कर सकें जब तक कि आप अच्छे नतीजे (स्पष्ट और चिकनी असमानता छवि) देख सकें। नीचे दिए गए कोड ट्रैक-बार उत्पन्न करने के तरीके पर एक छोटा और सरल उदाहरण है (मैंने इसे यथासंभव सरल लिखा है)। आवश्यकतानुसार उपयोग करें:

int PreFilterType = 0, PreFilterCap = 0, MinDisparity = 0, UniqnessRatio = 0, TextureThreshold = 0, 
    SpeckleRange = 0, SADWindowSize = 5, SpackleWindowSize = 0, numDisparities = 0, numDisparities2 = 0, PreFilterSize = 5; 


      Ptr<StereoBM> sbm = StereoBM::create(numDisparities, SADWindowSize); 

while(1) 
{ 
      sbm->setPreFilterType(PreFilterType); 
      sbm->setPreFilterSize(PreFilterSize); 
      sbm->setPreFilterCap(PreFilterCap + 1); 
      sbm->setMinDisparity(MinDisparity-100); 
      sbm->setTextureThreshold(TextureThreshold*0.0001); 
      sbm->setSpeckleRange(SpeckleRange); 
      sbm->setSpeckleWindowSize(SpackleWindowSize); 
      sbm->setUniquenessRatio(0.01*UniqnessRatio); 
      sbm->setSmallerBlockSize(15); 
      sbm->setDisp12MaxDiff(32); 

      namedWindow("Track Bar Window", CV_WINDOW_NORMAL); 
      cvCreateTrackbar("Number of Disparities", "Track Bar Window", &PreFilterType, 1, 0); 
      cvCreateTrackbar("Pre Filter Size", "Track Bar Window", &PreFilterSize, 100); 
      cvCreateTrackbar("Pre Filter Cap", "Track Bar Window", &PreFilterCap, 61); 
      cvCreateTrackbar("Minimum Disparity", "Track Bar Window", &MinDisparity, 200); 
      cvCreateTrackbar("Uniqueness Ratio", "Track Bar Window", &UniqnessRatio, 2500); 
      cvCreateTrackbar("Texture Threshold", "Track Bar Window", &TextureThreshold, 10000); 
      cvCreateTrackbar("Speckle Range", "Track Bar Window", &SpeckleRange, 500); 
      cvCreateTrackbar("Block Size", "Track Bar Window", &SADWindowSize, 100); 
      cvCreateTrackbar("Speckle Window Size", "Track Bar Window", &SpackleWindowSize, 200); 
      cvCreateTrackbar("Number of Disparity", "Track Bar Window", &numDisparities, 500); 

      if (PreFilterSize % 2 == 0) 
      { 
       PreFilterSize = PreFilterSize + 1; 
      } 


      if (PreFilterSize2 < 5) 
      { 
       PreFilterSize = 5; 
      } 

      if (SADWindowSize % 2 == 0) 
      { 
       SADWindowSize = SADWindowSize + 1; 
      } 

      if (SADWindowSize < 5) 
      { 
       SADWindowSize = 5; 
      } 


      if (numDisparities % 16 != 0) 
      { 
       numDisparities = numDisparities + (16 - numDisparities % 16); 
      } 
     } 
} 

यदि आपको उचित परिणाम और चिकनी असमानता छवि नहीं मिल रही है, तो निराश न हों। अपने एल्गोरिदम के साथ ओपनसीवी नमूना छवियों (इसमें एक नारंगी डेस्क दीपक वाला एक) का उपयोग करने का प्रयास करें ताकि यह सुनिश्चित किया जा सके कि आपके पास सही पाइप-लाइन है और फिर अलग-अलग दूरी से चित्र लेने का प्रयास करें और स्टीरियोबीएम/स्टीरियोएसबीबीएम पैरामीटर के साथ खेलो जब तक कि आप कुछ प्राप्त नहीं कर लेते उपयोगी। मैंने इस उद्देश्य के लिए अपना खुद का चेहरा इस्तेमाल किया और चूंकि मेरे पास बहुत छोटी बेसलाइन थी, इसलिए मैं अपने कैमरों के बहुत करीब आ गया (यहां मेरे 3 डी चेहरे पॉइंट-क्लाउड पिक्चर का एक लिंक है, और हे, आप हँसने की हिम्मत नहीं करते !!!) 1 मैं एक हफ्ते के संघर्ष के बाद खुद को 3 डी पॉइंट-क्लाउड फॉर्म में देखकर बहुत खुश था। मैं पहले कभी खुद को देखकर खुश नहीं हुआ !!! ;)

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