minarea.cpp 1.63 KB
Newer Older
a  
Kai Westerkamp committed
1 2
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
wester committed
3 4 5 6 7 8 9 10

#include <iostream>

using namespace cv;
using namespace std;

static void help()
{
wester committed
11 12 13 14 15 16
    cout << "This program demonstrates finding the minimum enclosing box or circle of a set\n"
            "of points using functions: minAreaRect() minEnclosingCircle().\n"
            "Random points are generated and then enclosed.\n"
            "Call:\n"
            "./minarea\n"
            "Using OpenCV version %s\n" << CV_VERSION << "\n" << endl;
wester committed
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
}

int main( int /*argc*/, char** /*argv*/ )
{
    help();

    Mat img(500, 500, CV_8UC3);
    RNG& rng = theRNG();

    for(;;)
    {
        int i, count = rng.uniform(1, 101);
        vector<Point> points;
        for( i = 0; i < count; i++ )
        {
            Point pt;
            pt.x = rng.uniform(img.cols/4, img.cols*3/4);
            pt.y = rng.uniform(img.rows/4, img.rows*3/4);

            points.push_back(pt);
        }

        RotatedRect box = minAreaRect(Mat(points));

        Point2f center, vtx[4];
        float radius = 0;
        minEnclosingCircle(Mat(points), center, radius);
        box.points(vtx);

        img = Scalar::all(0);
        for( i = 0; i < count; i++ )
wester committed
48
            circle( img, points[i], 3, Scalar(0, 0, 255), CV_FILLED, CV_AA );
wester committed
49 50

        for( i = 0; i < 4; i++ )
wester committed
51
            line(img, vtx[i], vtx[(i+1)%4], Scalar(0, 255, 0), 1, CV_AA);
wester committed
52

wester committed
53
        circle(img, center, cvRound(radius), Scalar(0, 255, 255), 1, CV_AA);
wester committed
54

wester committed
55
        imshow( "rect & circle", img );
wester committed
56 57 58 59 60 61 62 63

        char key = (char)waitKey();
        if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC'
            break;
    }

    return 0;
}