2013-05-17 23 views
9

このコードのおかげで、私はopenCvでdelaunay三角測量を行いました: example code (partiluclar draw_subdiv内)。 しかし、私が三角測量を表示したいとき、私は三角測量に属さないメッシュと線を取得します。この線は三角測量アルゴリズムが "無限"で掲示された三角形を考慮して仕事を開始することによるものです。Delaunay三角測量opencv C++

メッシュだけを凸包に描画する方法を教えてください(この行は除きます)?

表示機能:

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

主な機能:

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

結果:

enter image description here

+0

plsは、あなたの表示機能を投稿してください。 – Solkar

答えて

10

まあ、私はそれが簡単だと思います。ポイントが画像から外れているときだけ検出し、それらを描画しません。お使いのディスプレイ機能の書き込みで

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

ご協力いただきありがとうございます。 – axel

関連する問題