drawContours函数

drawContours函数1 drawContours 函数的作用主要用于画出图像的轮廓 2 函数的调用形式 void nbsp drawContours InputOutputA nbsp image InputArrayOf nbsp contours int nbsp contourIdx constScalar amp nbsp color int nbsp thickness 1 int nbsp lineType 8 InputArr

1、drawContours函数的作用

主要用于画出图像的轮廓

2、函数的调用形式

void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )


函数参数详解:

其中第一个参数image表示目标图像,

第二个参数contours表示输入的轮廓组,每一组轮廓由点vector构成,

第三个参数contourIdx指明画第几个轮廓,如果该参数为负值,则画全部轮廓,

第四个参数color为轮廓的颜色,

第五个参数thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部,

第六个参数lineType为线型,

第七个参数为轮廓结构信息,

第八个参数为maxLevel


opencv代码:

#include "cv.h" #include "highgui.h" using namespace cv; int main( int argc, char argv ) { 
    Mat src; // the first command-line parameter must be a filename of the binary // (black-n-white) image if( argc != 2 || !(src=imread(argv[1], 0)).data) return -1; Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3); src = src > 1; namedWindow( "Source", 1 ); imshow( "Source", src ); vector<vector<Point> > contours; vector<Vec4i> hierarchy; findContours( src, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); // iterate through all the top-level contours, // draw each connected component with its own random color int idx = 0; for( ; idx >= 0; idx = hierarchy[idx][0] ) { 
    Scalar color( rand()&255, rand()&255, rand()&255 ); drawContours( dst, contours, idx, color, CV_FILLED, 8, hierarchy ); } namedWindow( "Components", 1 ); imshow( "Components", dst ); waitKey(0); }


提取到轮廓后,其实我们更关心的是如果把这些轮廓转换为可以利用的特征,也就是涉及到轮廓的描述问题,这时就有多种方法可以选择,比如矢量化为多边形、矩形、椭圆等。OpenCV里提供了一些这样的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 轮廓表示为一个矩形
Rect r = boundingRect(Mat(contours[0]));
rectangle(result, r, Scalar(255), 2);
 
// 轮廓表示为一个圆
float
radius;
Point2f center;
minEnclosingCircle(Mat(contours[1]), center, radius);
circle(result, Point(center),
static_cast
<
int
>(radius), Scalar(255), 2);
 
// 轮廓表示为一个多边形
vector poly;
approxPolyDP(Mat(contours[2]), poly, 5,
true
);
vector ::const_iterator itp = poly.begin();
while
(itp != (poly.end() - 1))
{
    
line(result, *itp, *(itp + 1), Scalar(255), 2);
    
++itp;
}
line(result, *itp, *(poly.begin()), Scalar(255), 2);
// 轮廓表示为凸多边形
vector hull;
convexHull(Mat(contours[3]), hull);
vector ::const_iterator ith = hull.begin();
while
(ith != (hull.end() - 1))
{
    
line(result, *ith, *(ith + 1), Scalar(255), 2);
    
++ith;
}
line(result, *ith, *(hull.begin()), Scalar(255), 2);

对连通区域的分析到此远远没有结束,我们可以进一步计算每一个连通区域的其他属性,比如:重心、中心矩等特征,这些内容以后有机会展开来写。

以下几个函数可以尝试:minAreaRect:计算一个最小面积的外接矩形,contourArea可以计算轮廓内连通区域的面积;pointPolygenTest可以用来判断一个点是否在一个多边形内。mathShapes可以比较两个形状的相似性,相当有用的一个函数。





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202727.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:26
下一篇 2026年3月19日 下午11:27


相关推荐

  • OpenClaw API 推荐与模型配置指南:国内使用完全攻略(2026)

    OpenClaw API 推荐与模型配置指南:国内使用完全攻略(2026)

    2026年3月18日
    3
  • 三十岁以上的男人才会用到的网站,不浮夸这是真的

    三十岁以上的男人才会用到的网站,不浮夸这是真的三十岁以上的男人其实已经经历过很多多岁月了,无论是工作、社交、还是家庭都应该是得心应手的。但是未必所有三十岁的男人都用到过下面这些网站。PPT素材类优品PPT我们可以免费PPT模板下载网站!企帮

    2022年7月3日
    35
  • 切蛋糕(贪心 or 优先队列)

    切蛋糕(贪心 or 优先队列)

    2021年5月26日
    86
  • 2017年java培训机构排名[通俗易懂]

    2017年java培训机构排名[通俗易懂]俗话说360行,行行转IT,在如今这个互联网横行的时代,做一个Java开发工程师可以算得上是集智慧,钞票为一身的光鲜职业了,尤其是在北上广这一线城市,年薪30w的黄金小鲜肉随处可见,这也是许多高校毕业生,甚至是其它行业工作数年后都望尘莫及的。因为梦想高薪,跨专业,转行的人比比皆是,也就免不了和一些Java培训机构打交道,而如今这世道教育机构也不见得都那么有“良心”就拿北京来说吧,大大小小的Java培训机构不下5000家,这里边有正规做良心教育的,也有浑水摸鱼什么都不是的,有面向全国招生的,也有面向全国“诈骗

    2022年10月4日
    4
  • ftp文件上传及下载工具类[通俗易懂]

    ftp文件上传及下载工具类[通俗易懂]1、ftp文件上传用例解析(需使用apacher的commons-net-3.3.jar)publicclassTestFtp{@Testpublicvoidtest()throwsException{//1、创建FTP客户端FTPClientftpClient=newFTPClient();//2、

    2022年6月6日
    31
  • 常见电子元器件的常用品牌汇总

    ​抽时间汇总了一些常见电子元器件常用品牌,大家在元器件选型时可以参考。电阻:Yageo国巨、Uniohm厚声、Walsin华新科、Fenghua风华、Ralec旺诠、KOA兴亚、Panasonic松下、AVX、Rohm罗姆、Samsung三星、TDK、TMTEC泰铭、Kyocera京瓷、PHYCOM飞元。电容:Yageo国巨、Samsung三星、Eyang宇阳、Murata村田、Taiyo太诱、Fenghua风华、Kyocera京瓷、HEC禾伸堂、Kemet基美、ISND华信安、AVX、TDK、Nich

    2022年4月4日
    84

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号