2012-10-19 15 views
5

मैं इस काले बहुभुज के चारों ओर कंटूर की पहचान करने की कोशिश करता हूं और मुझे उन बिंदुओं तक पहुंचने की आवश्यकता है लेकिन यह मेरे लिए काम नहीं करता है। यह इनपुट छवि enter image description herejavacv/opencv का उपयोग कर काले बहुभुज पर बिंदुओं की पहचान कैसे करें?

लेकिन जब मैं निम्नलिखित कोड करने का प्रयास करता हूं तो उसने अपेक्षित परिणाम नहीं दिया जिसका अर्थ यह होना चाहिए।

 CanvasFrame cnvs=new CanvasFrame("Polygon"); 
     cnvs.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 

     CvMemStorage storage=CvMemStorage.create(); 
     CvSeq squares = new CvContour(); 
     squares = cvCreateSeq(0, sizeof(CvContour.class), sizeof(CvSeq.class), storage); 
     String path="project/Test/img/black.png"; 
     IplImage src = cvLoadImage(path); 
     IplImage gry=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); 
     cvCvtColor(src, gry, CV_BGR2GRAY); 
     cvThreshold(gry, gry, 230, 255, CV_THRESH_BINARY_INV); 
     cnvs.showImage(gry); 
     cvFindContours(gry, storage, squares, Loader.sizeof(CvContour.class), CV_RETR_LIST, CV_CHAIN_APPROX_NONE); 
     CvSeq ss=null; 
     CvSeq tmp=null; 
     int ii=0; 
      for (ss=squares; ss!=null; ss=ss.h_next()) { 
       tmp=cvApproxPoly(ss, sizeof(CvContour.class), storage, CV_POLY_APPROX_DP, 8, 0); 
       System.out.println("index "+ii+" points "+tmp.total()+" area "+cvContourArea(ss, CV_WHOLE_SEQ, 0)); 
       cvDrawContours(src, ss, CvScalar.RED, CV_RGB(248, 18, 18), 1, -1, 8); 
       //drawPoly(src, tmp); 
      } 
     IplConvKernel mat=cvCreateStructuringElementEx(7, 7, 3, 3, CV_SHAPE_RECT, null); 
     cvDilate(src, src, mat, CV_C); 
     cvErode(src, src, mat, CV_C); 
     cnvs.showImage(src); 
     saveImage("nw.png", src); 

लेकिन जब मैं जाँच बाहर यह केवल

सूचकांक 0 अंक 8 क्षेत्र 20179,0

इसका मतलब है कि यह केवल बहुभुज के 8 अंक की पहचान लेकिन यह 12 अंक होना चाहिए देता है डाल दिया। कृपया कोई इस कोड की समस्या को समझा सकता है।

इस शो से बाहर छवि

enter image description here

उत्तर

1

डाल cvApproxPoly() फ़ंक्शन वक्र सन्निकटन के लिए Ramer–Douglas–Peucker एल्गोरिथ्म का उपयोग करता। एल्गोरिदम का उद्देश्य कम अंक के साथ एक समान वक्र खोजना है।

  • अंकों की सूची (कोने),
  • aproximation सटीकता: एल्गोरिथ्म ही इनपुट के रूप में दो पैरामीटर लेता है।

संक्षेप में, अधिक से अधिक aproximation सटीकता मूल्य, बात करने के लिए बड़ा मौका (, विकिपीडिया article का संदर्भ लें विशेष रूप से this एनीमेशन) aproximated अवस्था में छोड़ा गया जा रहा है। आपके फ़ंक्शन कॉल में:

cvApproxPoly(ss, sizeof(CvContour.class), storage, CV_POLY_APPROX_DP, 8, 0); 

5 वां पैरामीटर अपरिवर्तनीय सटीकता है। यदि आप चरम की संख्या को कम नहीं करना चाहते हैं तो मान छोटा होना चाहिए (इस उदाहरण के लिए 1 के आसपास मान वास्तव में 12 कोष्ठक देते हैं, इसलिए कोई अनुमान नहीं है)।