2013-05-17 6 views
9

Ich habe eine Delaunay Triangulation mit OpenCV dank dieses Codes: example code (in partiluclar draw_subdiv). Wenn ich jedoch die Triangulation anzeigen möchte, erhalte ich das Netz und die Linien, die nicht zur Triangulation gehören. Diese Linien sind darauf zurückzuführen, dass der Triangulationsalgorithmus seine Arbeit beginnt, wenn er Dreiecke betrachtet, die auf "unendlich" stehen.Delaunay Triangulation OpenCV C++

Können Sie mir erklären, wie man bitte nur das Netz in die konvexe Hülle (ohne diese Linien) zeichnet?

Anzeigefunktion:

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

Hauptfunktion:

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

Ergebnis:

enter image description here

+0

Posten Sie Ihre Display-Funktion, pls. – Solkar

Antwort

10

Nun, ich denke, dass es einfach ist. Erkennen Sie einfach, wenn die Punkte außerhalb des Bildes sind, und zeichnen Sie sie nicht.

In Ihrer Anzeigefunktion schreiben:

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

Danke für Ihre Hilfe, es funktioniert. – axel

Verwandte Themen