2012-10-19 3 views
5

Cerco di identificare Contour attorno a questo poligono nero e ho bisogno di accedere a quei punti ma non funziona per me. Questa è l'immagine di input enter image description hereCome identificare i punti sul poligono nero usando javacv/opencv?

Ma quando provo a fare il seguente codice non ha dato il risultato atteso che significa che dovrebbe.

 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); 

Ma quando si controlla l'out put dà solo

indice 0 punti 8 zona 20179,0

Ciò significa che identificano solo 8 punti del poligono ma dovrebbe essere di 12 punti. Si prega di qualcuno può spiegare il problema di questo codice.

Questo mostra l'out put immagine

enter image description here

risposta

1

La funzione cvApproxPoly() utilizza Ramer–Douglas–Peucker algoritmo per la curva approssimazione. Lo scopo dell'algoritmo è trovare una curva simile con meno punti. L'algoritmo si prende due parametri come input:

  • elenco di punti (vertici),
  • precisione approssimazione.

Brevemente, maggiore è il valore acuracy approssimazione, la probabilità maggiore al punto di essere omesso in curva aproximated (fare riferimento alla Wikipedia article, soprattutto this animazione). Nella funzione di chiamata:

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

il 5 ° parametro è la precisione approssimazione. Se non vuoi ridurre il numero di vertici il valore dovrebbe essere piccolo (per questo esempio i valori intorno a 1 danno esattamente 12 vertici, quindi nessuna approssimazione).