2013-05-17 10 views
9

मैंने ओपनसीवी के साथ एक डेल्यून त्रिकोण बनाया है इस कोड के लिए धन्यवाद: example code (partiluclar draw_subdiv में)। हालांकि, जब मैं त्रिभुज प्रदर्शित करना चाहता हूं, तो मुझे जाल और रेखाएं मिलती हैं जो त्रिभुज से संबंधित नहीं हैं। ये रेखाएं इस तथ्य के कारण हैं कि त्रिभुज एल्गोरिदम "अनंत" पर पोस्ट किए गए त्रिकोणों पर विचार करते हुए अपना काम शुरू करता है।Delaunay त्रिकोण ओपनसीवी सी ++

क्या आप मुझे बता सकते हैं कि कैसे केवल उत्तल उत्तल में जाल को आकर्षित करने के लिए (इस लाइन के बिना)?

प्रदर्शन समारोह:

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

पोस्ट अपने प्रदर्शन समारोह, कृपया। – 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

संबंधित मुद्दे