2013-05-17 11 views
9

Ho realizzato una triangolazione delaunay con openCv grazie a questo codice: example code (in partiluclar draw_subdiv). Tuttavia, quando voglio visualizzare la triangolazione, ottengo la mesh e le linee che non appartengono alla triangolazione. Queste linee sono dovute al fatto che l'algoritmo di triangolazione inizia il suo lavoro considerando i triangoli pubblicati su "infinito".Triangolazione di Delaunay opencv C++

Potete spiegarmi come disegnare solo la maglia nello scafo convesso per favore (senza questa linea)?

funzione di visualizzazione:

void draw_subdiv(Mat &img, Subdiv2D& subdiv, Scalar delaunay_color) 
{ 

    vector<Vec6f> triangleList; 
    subdiv.getTriangleList(triangleList); 
    vector<Point> pt(3); 

    for(size_t i = 0; i < triangleList.size(); ++i) 
    { 
     Vec6f t = triangleList[i]; 

     pt[0] = Point(cvRound(t[0]), cvRound(t[1])); 
     pt[1] = Point(cvRound(t[2]), cvRound(t[3])); 
     pt[2] = Point(cvRound(t[4]), cvRound(t[5])); 

     line(img, pt[0], pt[1], delaunay_color, 1); 
     line(img, pt[1], pt[2], delaunay_color, 1); 
     line(img, pt[2], pt[0], delaunay_color, 1); 
    } 
} 

funzione principale:

Mat image = imread(argv[1], 1); 

..... .... 
//creat delaunay                                 
Scalar delaunay_color(255, 255, 255), point_color(0,0,255); 
Rect rect(0,0,image.cols, image.rows); 

    Subdiv2D subdiv(rect); 

for(int i = 0; i < point.getDim(); ++i) 
    { 
     Point2f fp(point.getCoord()[i].real(), point.getCoord()[i].imag()); 
     subdiv.insert(fp); 
    } 

draw_subdiv(image, subdiv, delaunay_color); 
imwrite("data/delaunay.jpg", image); 

Risultato:

enter image description here

+0

inviare la vostra funzione di visualizzazione, pls. – Solkar

risposta

10

Beh penso che sia facile. Rileva solo quando i punti sono fuori dall'immagine e non disegnarli.

Nella funzione di visualizzazione di scrittura:

void draw_subdiv(Mat &img, Subdiv2D& subdiv, Scalar delaunay_color) 
{ 
    bool draw; 
    vector<Vec6f> triangleList; 
    subdiv.getTriangleList(triangleList); 
    vector<Point> pt(3); 

    for(size_t i = 0; i < triangleList.size(); ++i) 
    { 
     Vec6f t = triangleList[i]; 

     pt[0] = Point(cvRound(t[0]), cvRound(t[1])); 
     pt[1] = Point(cvRound(t[2]), cvRound(t[3])); 
     pt[2] = Point(cvRound(t[4]), cvRound(t[5])); 
     // MY PIECE OF CODE 
     draw=true; 

     for(int i=0;i<3;i++){ 
     if(pt[i].x>img.width||pt[i].y>img.heigth||pt[i].x<0||pt[i].y<0) 
      draw=false; 
     } 
     if (draw){ 
     line(img, pt[0], pt[1], delaunay_color, 1); 
     line(img, pt[1], pt[2], delaunay_color, 1); 
     line(img, pt[2], pt[0], delaunay_color, 1); 
     } 


    } 
} 
+0

Grazie per il tuo aiuto sta funzionando. – axel

Problemi correlati