Fitting rotated boxes and ellipses for contours

RotatedRect fitEllipse(InputArray points)
Fits an ellipse around a set of 2D points.

RotatedRect minAreaRect(InputArray points)
Finds a rotated rectangle of the minimum area enclosing the input 2D point set.

vector<vector<Point>> contours;
findContours( ..., contours, ...); // This will find out the contours and save in contours
cout<<endl<<Mat(contours[index])<<endl; //index = 0,1,2,... used to print the format of contours
ellipse = fitEllipse( Mat(contours[i]) ); // fitting ellipse in contour points
Rect = minAreaRect( Mat(contours[i]) ); 
 
The code provided below is slight modification of code given in OpenCV documentation.

Steps:

  1. Load image
  2. Convert to gray-scale.
  3. Remove noise by blurring with a Gaussian filter
  4. Create new window
  5. Add trackbar to the window
  • Detect Canny edges
  • Find contours
  • Find the rotated rectangles and ellipses for each contour
  • Draw contours, rotated rectangles and ellipses

Functions:

 

Example:

-----------------
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include<iostream>

using namespace cv;
using namespace std;

Mat src; Mat src_gray;
int thresh = 73;
int points = 50;
int max_thresh = 255;
RNG rng(12345);

void thresh_callback(int, void*);

int main( )
{
    /// Load source image and convert it to gray
    src = imread( "1.jpg", 1 );

    /// Convert image to gray and blur it
    cvtColor( src, src_gray, CV_BGR2GRAY );
    blur( src_gray, src_gray, Size(3,3) );

    namedWindow( "Source", CV_WINDOW_AUTOSIZE );    imshow( "Source", src );
    createTrackbar( " Threshold:", "Source", &thresh, max_thresh, thresh_callback );
    
    namedWindow( "Source1", CV_WINDOW_AUTOSIZE );    imshow( "Source1", src );
    createTrackbar( " Threshold:", "Source1", &points, max_thresh, thresh_callback );

    thresh_callback(0,0);

    waitKey(0);
    return(0);
}

void thresh_callback( int, void*)
{
    Mat threshold_output;
    Mat edge;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    /// Detect edges     
    Canny( src_gray, edge, thresh, 3*thresh, 3);
    edge.convertTo(threshold_output, CV_8U);

    /// Find contours
    findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

    /// Find the rotated rectangles and ellipses for each contour
    vector<RotatedRect> minRect( contours.size() );
    vector<RotatedRect> minEllipse( contours.size() );
    
    cout<<endl<<contours[1]<<endl;
    cout<<endl<<Mat(contours[1])<<endl;

    for( int i = 0; i < contours.size(); i++ )
    { minRect[i] = minAreaRect( Mat(contours[i]) );
    if( contours[i].size() > points )
    { minEllipse[i] = fitEllipse( Mat(contours[i]) ); }
    }

    /// Draw contours + rotated rects + ellipses
    Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
    for( int i = 0; i< contours.size(); i++ )
    {
        Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
        // contour
        drawContours( drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
        // ellipse
        ellipse( drawing, minEllipse[i], color, 2, 8 );
        // rotated rectangle
        Point2f rect_points[4]; minRect[i].points( rect_points );
        for( int j = 0; j < 4; j++ )
            line( drawing, rect_points[j], rect_points[(j+1)%4], color, 1, 8 );
    }

    /// Show in a window
    namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
    imshow( "Contours", drawing );
}
-----------------

Result:


1 comment:

  1. Trung tâm đào tạo kế toán thực hành Tại cầu giấy
    Trung tâm đào tạo kế toán thực hành Tại từ liêm
    Trung tâm đào tạo kế toán thực hành Tại thanh xuân
    Trung tâm đào tạo kế toán thực hành Tại hà đông
    Trung tâm đào tạo kế toán thực hành Tại long biên
    Trung tâm đào tạo kế toán thực hành Tại nguyễn chính thanh đống đa
    Trung tâm đào tạo kế toán thực hành Tại minh khai hai bà trưng
    Trung tâm đào tạo kế toán thực hành Tại bắc ninh
    Trung tâm đào tạo kế toán thực hành Tại hải phòng
    Trung tâm đào tạo kế toán thực hành Tại tphcm
    Trung tâm đào tạo kế toán thực hành Tại quận 3
    Trung tâm đào tạo kế toán thực hành Tại thủ đức
    Trung tâm đào tạo kế toán thực hành Tại đà nẵng
    Trung tâm đào tạo kế toán thực hành Tại biên hòa
    Trung tâm đào tạo kế toán thực hành Tại đồng nai
    Trung tâm đào tạo kế toán thực hành Tại nam định
    Trung tâm đào tạo kế toán thực hành Tại thái bình
    Trung tâm đào tạo kế toán thực hành Tại bắc giang
    Trung tâm đào tạo kế toán thực hành Tại vĩnh phúc
    Trung tâm đào tạo kế toán thực hành Tại thái nguyên
    Trung tâm đào tạo kế toán thực hành Tại quảng ninh
    Trung tâm đào tạo kế toán thực hành Tại hải dương
    Trung tâm đào tạo kế toán thực hành Tại hưng yên
    Trung tâm đào tạo kế toán thực hành Tại hà nam
    Trung tâm đào tạo kế toán thực hành Tại ninh bình
    Trung tâm đào tạo kế toán thực hành Tại nghệ an
    Trung tâm đào tạo kế toán thực hành Tại vũng tàu

    ReplyDelete