2012-10-19 33 views
5

我試圖識別這個黑色多邊形周圍的輪廓,我需要訪問這些點,但它不適合我。這是輸入圖像 enter image description here如何使用javacv/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 acuracy值,在aproximated曲線省略了更大的機會來點(請參閱維基百科article,尤其this動畫)。在你的函數調用中:

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

第5個參數是aproximation準確性。如果你不想減少頂點的數量,那麼這個值應該很小(在這個例子中,1左右的值恰好給出了12個頂點,因此沒有近似值)。

相關問題