imgproc模块--可倾斜边界

来源:互联网 发布:中国五矿待遇知乎 编辑:程序博客网 时间:2024/05/21 04:41

1.目的
(1)使用openCV函数minAreaRect获取矩形边界
(2)使用openCV函数fitEllipse获取椭圆边界

2.完整代码
(1)CommonInclude.h

#ifndef COMMON_INCLUDE#define COMMON_INCLUDE#include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>using namespace std;using namespace cv;#endif

(2)Bounding.cpp

#include"CommonInclude.h"Mat src; Mat src_gray;int thresh = 100;int max_thresh = 255;RNG rng(12345);/** @function thresh_callback */void thresh_callback(int, void* ){    Mat threshold_output;    vector<vector<Point> > contours;    vector<Vec4i> hierarchy;    /// 阈值化检测边界    threshold( src_gray, threshold_output, thresh, 255, THRESH_BINARY );    /// 寻找轮廓    findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );    /// 对每个找到的轮廓创建可倾斜的边界框和椭圆    vector<RotatedRect> minRect( contours.size() );    vector<RotatedRect> minEllipse( contours.size() );    for( int i = 0; i < contours.size(); i++ )    {         //返回轮廓的矩形边界框        minRect[i] = minAreaRect( Mat(contours[i]) );        if( contours[i].size() > 5 )        {            //返回轮廓的椭圆边界框            minEllipse[i] = fitEllipse( Mat(contours[i]) );         }     }    /// 绘出轮廓及其可倾斜的边界框和边界椭圆    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 );     }    /// 结果在窗体中显示    namedWindow( "Contours", CV_WINDOW_AUTOSIZE );    imshow( "Contours", drawing );}/** @function main */int main( int argc, char** argv ){    /// 加载源图像    src = imread( argv[1], 1 );    /// 转为灰度图并模糊化    cvtColor( src, src_gray, CV_BGR2GRAY );    blur( src_gray, src_gray, Size(3,3) );    /// 创建窗体    char source_window[] = "Source";    namedWindow( source_window, CV_WINDOW_AUTOSIZE );    imshow( source_window, src );    createTrackbar( " Threshold:", "Source", &thresh, max_thresh, thresh_callback );    thresh_callback( 0, 0 );    waitKey(0);    return(0);}

参考文献
1.http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.html

原创粉丝点击