OpenCV学习(32) 求轮廓的包围盒

      在OpenCV中,能够很方便的求轮廓包围盒。包括矩形,圆形,椭圆形以及倾斜的矩形(包围面积最小)集中包围盒。用到的四个函数是:

Rect boundingRect(InputArray points)

void minEnclosingCircle(InputArray points, Point2f& center, float& radius)

RotatedRect minAreaRect(InputArray points)

RotatedRect fitEllipse(InputArray points)

 

输入的参数都是轮廓,下面是程序代码:

1. Rect和原型包围盒代码:

nt main( int argc, char** argv )    {//装入图像    src = imread("../ballon.jpg", 1 );

//转化为灰度图并进行blur操作    cvtColor( src, src_gray, CV_BGR2GRAY );    blur( src_gray, src_gray, Size(3,3) );

namedWindow( "source", CV_WINDOW_AUTOSIZE );    imshow( "source", src );

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<vector<Point> > contours_poly( contours.size() );    vector<Rect> boundRect( contours.size() );    vector<Point2f>center( contours.size() );    vector<float>radius( contours.size() );

//得到每个轮廓的包围盒RECT以及园,园用中心和半径表示for( int i = 0; i < contours.size(); i++ )        {         approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );        boundRect[i] = boundingRect( Mat(contours_poly[i]) );        minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[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) );        drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );//tl是左上角坐标, br是右下角坐标        rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );        circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );        }

namedWindow( "Contours", CV_WINDOW_AUTOSIZE );    imshow( "Contours", drawing );

while(1)        waitKey(0);return(0);    }

程序运行效果:

 

2. 椭圆形和倾斜的矩形包围盒代码:

int main( int argc, char** argv )    {//装入图像    src = imread("../ballon.jpg", 1 );

//转化为灰度图并进行blur操作    cvtColor( src, src_gray, CV_BGR2GRAY );    blur( src_gray, src_gray, Size(3,3) );

namedWindow( "source", CV_WINDOW_AUTOSIZE );    imshow( "source", src );

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) );

//查找轮廓的最小旋转rect和椭圆包围盒    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) );// 轮廓        drawContours( drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point() );// 椭圆        ellipse( drawing, minEllipse[i], color, 2, 8 );// 旋转rect        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 );

while(1)        waitKey(0);return(0);    }

程序运行效果:

 

 

 

时间: 2024-09-29 16:14:49

OpenCV学习(32) 求轮廓的包围盒的相关文章

OpenCV学习(34) 点到轮廓的距离

      在OpenCV中,可以很方便的计算一个像素点到轮廓的距离,计算距离的函数为: double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist) Parameters: contour – 输入参数轮廓. pt – 测试的点. measureDist – 如果为false的话,则函数计算符号,在轮廓外部在为-1,在轮廓内为1,在轮廓上,则为0.如果为ture,则计算实际的像素符号距离,在轮廓外的点像素距离

OpenCV学习(30) 轮廓defects

     上一篇教程中,我们学习了如何计算轮廓的凸包,其实对一个轮廓而言,可能它的凸包和它本身是重合的,也有可能不是重合的.比如下面左边图像的轮廓本身就是凸包,而右边图像的轮廓则不是.我们可以通过函数bool isContourConvex(InputArray contour),来判定一个轮廓是否是凸包,是的话返回true,否则false[注意测试的轮廓必须是简单轮廓,没有自交叉之类的].       对一个非凸包的轮廓而言,它包括一系列的凹陷区域,这些区域称作defect,比如下面手轮廓中,

OpenCV学习(28) 轮廓

      OpenCV中可以方便的在一副图像中检测到轮廓,并把这些轮廓画出来.主要用到两个函数:一个是findContours( img, contours0, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);另一个是drawContours( cnt_img, contours, idx, color, 1, 8, hierarchy ); int main( int argc, char**) { Mat img = Mat::zeros(w, w,

opencv-OpenCV里面求轮廓的二阶矩,灰度平均值,灰度方差值,灰度熵,纹理熵,相关度,Hu不变矩?

问题描述 OpenCV里面求轮廓的二阶矩,灰度平均值,灰度方差值,灰度熵,纹理熵,相关度,Hu不变矩? OpenCV里面求轮廓的二阶矩,灰度平均值,灰度方差值,灰度熵,纹理熵,相关度,Hu不变矩...的函数是什么啊?

(转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

      首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址:http://blog.csdn.net/column/details/opencv-manual.html 2:部分OpenCV的函数解读和原理解读 作者:梦想腾飞数量:20篇博文网址:http:/

c++基础-新手学习,求带,求解

问题描述 新手学习,求带,求解 怎么把cout <<setfill(' ') 中的字符可控 就是可以由键盘输入填充字符 解决方案 新手求带 解决方案二: char 字符;cin >> 字符;cout <<setfill(字符);

指针-opencv学习灰度图锐化的两个函数的差别不理解

问题描述 opencv学习灰度图锐化的两个函数的差别不理解 下面是一个灰度图锐化的函数,我有两种方式实现,方式1,和方式2,居然得到的结果不一样,图片数据也不一样,请高手看一下,可能是C语言的知识掌握的不好. void my_sharpen(const cv::Mat &image, cv::Mat &result) { result.create (image.size(), image.type ()); for(int j=1; j<image.rows-1; j++) { u

教程-关于Python学习,求指点

问题描述 关于Python学习,求指点 我想学Python, 怎么样才能把它学的透呢?求各位大神指点迷津,推荐教程或者Python培训机构 .教的好就行. 解决方案 python核心编程,看书,多动手,练习. 解决方案二: 感觉基本很难说把python学透的吧,把python的核心理解了,然后各种函数.方法只需要看官方文档就好. 所以其实是需要用的时候边看官方文档边学然后现用就行了. 感觉如果有其它语言(如C/C++)的基础,然后愿意用python写东西就很快上手的,并不需要特地去看教程. 解决

刚学习C#,求一个P2P 多人聊天室源代码学习

问题描述 本人菜鸟,刚学习C#,求一个P2P多人聊天室源代码学习,求犀利源代码学习借鉴. 解决方案 解决方案二:可以发到本人邮箱451195526@qq.com谢谢~~~各位大牛!解决方案三:去51aspx网站下载