~paparazzi-uav/paparazzi/v5.0-manual

« back to all changes in this revision

Viewing changes to sw/ext/opencv_bebop/opencv/samples/cpp/delaunay2.cpp

  • Committer: Paparazzi buildbot
  • Date: 2016-05-18 15:00:29 UTC
  • Revision ID: felix.ruess+docbot@gmail.com-20160518150029-e8lgzi5kvb4p7un9
Manual import commit 4b8bbb730080dac23cf816b98908dacfabe2a8ec from v5.0 branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <opencv2/imgproc/imgproc.hpp>
 
2
#include <opencv2/highgui/highgui.hpp>
 
3
#include <iostream>
 
4
 
 
5
using namespace cv;
 
6
using namespace std;
 
7
 
 
8
static void help()
 
9
{
 
10
    cout << "\nThis program demostrates iterative construction of\n"
 
11
           "delaunay triangulation and voronoi tesselation.\n"
 
12
           "It draws a random set of points in an image and then delaunay triangulates them.\n"
 
13
           "Usage: \n"
 
14
           "./delaunay \n"
 
15
           "\nThis program builds the traingulation interactively, you may stop this process by\n"
 
16
           "hitting any key.\n";
 
17
}
 
18
 
 
19
static void draw_subdiv_point( Mat& img, Point2f fp, Scalar color )
 
20
{
 
21
    circle( img, fp, 3, color, FILLED, LINE_8, 0 );
 
22
}
 
23
 
 
24
static void draw_subdiv( Mat& img, Subdiv2D& subdiv, Scalar delaunay_color )
 
25
{
 
26
#if 1
 
27
    vector<Vec6f> triangleList;
 
28
    subdiv.getTriangleList(triangleList);
 
29
    vector<Point> pt(3);
 
30
 
 
31
    for( size_t i = 0; i < triangleList.size(); i++ )
 
32
    {
 
33
        Vec6f t = triangleList[i];
 
34
        pt[0] = Point(cvRound(t[0]), cvRound(t[1]));
 
35
        pt[1] = Point(cvRound(t[2]), cvRound(t[3]));
 
36
        pt[2] = Point(cvRound(t[4]), cvRound(t[5]));
 
37
        line(img, pt[0], pt[1], delaunay_color, 1, LINE_AA, 0);
 
38
        line(img, pt[1], pt[2], delaunay_color, 1, LINE_AA, 0);
 
39
        line(img, pt[2], pt[0], delaunay_color, 1, LINE_AA, 0);
 
40
    }
 
41
#else
 
42
    vector<Vec4f> edgeList;
 
43
    subdiv.getEdgeList(edgeList);
 
44
    for( size_t i = 0; i < edgeList.size(); i++ )
 
45
    {
 
46
        Vec4f e = edgeList[i];
 
47
        Point pt0 = Point(cvRound(e[0]), cvRound(e[1]));
 
48
        Point pt1 = Point(cvRound(e[2]), cvRound(e[3]));
 
49
        line(img, pt0, pt1, delaunay_color, 1, LINE_AA, 0);
 
50
    }
 
51
#endif
 
52
}
 
53
 
 
54
static void locate_point( Mat& img, Subdiv2D& subdiv, Point2f fp, Scalar active_color )
 
55
{
 
56
    int e0=0, vertex=0;
 
57
 
 
58
    subdiv.locate(fp, e0, vertex);
 
59
 
 
60
    if( e0 > 0 )
 
61
    {
 
62
        int e = e0;
 
63
        do
 
64
        {
 
65
            Point2f org, dst;
 
66
            if( subdiv.edgeOrg(e, &org) > 0 && subdiv.edgeDst(e, &dst) > 0 )
 
67
                line( img, org, dst, active_color, 3, LINE_AA, 0 );
 
68
 
 
69
            e = subdiv.getEdge(e, Subdiv2D::NEXT_AROUND_LEFT);
 
70
        }
 
71
        while( e != e0 );
 
72
    }
 
73
 
 
74
    draw_subdiv_point( img, fp, active_color );
 
75
}
 
76
 
 
77
 
 
78
static void paint_voronoi( Mat& img, Subdiv2D& subdiv )
 
79
{
 
80
    vector<vector<Point2f> > facets;
 
81
    vector<Point2f> centers;
 
82
    subdiv.getVoronoiFacetList(vector<int>(), facets, centers);
 
83
 
 
84
    vector<Point> ifacet;
 
85
    vector<vector<Point> > ifacets(1);
 
86
 
 
87
    for( size_t i = 0; i < facets.size(); i++ )
 
88
    {
 
89
        ifacet.resize(facets[i].size());
 
90
        for( size_t j = 0; j < facets[i].size(); j++ )
 
91
            ifacet[j] = facets[i][j];
 
92
 
 
93
        Scalar color;
 
94
        color[0] = rand() & 255;
 
95
        color[1] = rand() & 255;
 
96
        color[2] = rand() & 255;
 
97
        fillConvexPoly(img, ifacet, color, 8, 0);
 
98
 
 
99
        ifacets[0] = ifacet;
 
100
        polylines(img, ifacets, true, Scalar(), 1, LINE_AA, 0);
 
101
        circle(img, centers[i], 3, Scalar(), FILLED, LINE_AA, 0);
 
102
    }
 
103
}
 
104
 
 
105
 
 
106
int main( int argc, char** argv )
 
107
{
 
108
    cv::CommandLineParser parser(argc, argv, "{help h||}");
 
109
    if (parser.has("help"))
 
110
    {
 
111
        help();
 
112
        return 0;
 
113
    }
 
114
 
 
115
    Scalar active_facet_color(0, 0, 255), delaunay_color(255,255,255);
 
116
    Rect rect(0, 0, 600, 600);
 
117
 
 
118
    Subdiv2D subdiv(rect);
 
119
    Mat img(rect.size(), CV_8UC3);
 
120
 
 
121
    img = Scalar::all(0);
 
122
    string win = "Delaunay Demo";
 
123
    imshow(win, img);
 
124
 
 
125
    for( int i = 0; i < 200; i++ )
 
126
    {
 
127
        Point2f fp( (float)(rand()%(rect.width-10)+5),
 
128
                    (float)(rand()%(rect.height-10)+5));
 
129
 
 
130
        locate_point( img, subdiv, fp, active_facet_color );
 
131
        imshow( win, img );
 
132
 
 
133
        if( waitKey( 100 ) >= 0 )
 
134
            break;
 
135
 
 
136
        subdiv.insert(fp);
 
137
 
 
138
        img = Scalar::all(0);
 
139
        draw_subdiv( img, subdiv, delaunay_color );
 
140
        imshow( win, img );
 
141
 
 
142
        if( waitKey( 100 ) >= 0 )
 
143
            break;
 
144
    }
 
145
 
 
146
    img = Scalar::all(0);
 
147
    paint_voronoi( img, subdiv );
 
148
    imshow( win, img );
 
149
 
 
150
    waitKey(0);
 
151
 
 
152
    return 0;
 
153
}