Imgproc.findContours函数

//****************************************************************

转载于http://www.cnblogs.com/chenjianxiang/p/4225782.html

****************************************************************//


OpenCV里支持很多边缘提取的办法,可是如何在一幅图像里得到轮廓区域的参数呢,这就需要用到findContours函数,这个函数在OpenCV4Android的原型为:

void org.opencv.imgproc.Imgproc.findContours(Mat image, List<MatOfPoint> contours, Mat hierarchy, int mode, int method)


image参数为已经二值化的原图

contours参数为检测的轮廓数组,每一个轮廓用一个MatOfPoint类型的List表示

hiararchy参数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,该值设置为负数。

mode表示轮廓的检索模式例如:
 

CV_RETR_EXTERNAL表示只检测外轮廓
 
CV_RETR_LIST检测的轮廓不建立等级关系
 
CV_RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
 
CV_RETR_TREE建立一个等级树结构的轮廓。
 

method为轮廓的近似办法  

CV_CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1   
CV_CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息   
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

 

findContours经常与drawContours配合使用,用来将轮廓绘制出来。还可以得到轮廓的外包络矩形,使用函数boundingRect,如果想得到旋转的外包络矩形,使用函数minAreaRect,返回值为RotatedRect;
也可以得到轮廓的外包络圆,对应的函数为minEnclosingCircle;想得到轮廓的外包络椭圆,对应的函数为fitEllipse,返回值也是RotatedRect;可以用ellipse函数画出对应的椭圆。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV 中的 `findContours` 函数用于在二值图像中查找轮廓。它的函数原型如下: ```python contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) ``` 其中,参数含义如下: - `image`:输入二值图像; - `mode`:轮廓检索模式,有以下几种选项: - `cv.RETR_EXTERNAL`:只检索最外层的轮廓; - `cv.RETR_LIST`:检索所有的轮廓,并将其保存到列表中; - `cv.RETR_CCOMP`:检索所有轮廓,并将其组织成两层的层次结构; - `cv.RETR_TREE`:检索所有轮廓,并将其组织成完整的层次结构; - `method`:轮廓逼近方法,有以下几种选项: - `cv.CHAIN_APPROX_NONE`:存储所有的轮廓点; - `cv.CHAIN_APPROX_SIMPLE`:仅存储轮廓的端点; - `cv.CHAIN_APPROX_TC89_L1`:使用 Teh-Chin 链逼近算法; - `cv.CHAIN_APPROX_TC89_KCOS`:使用 Teh-Chin 链逼近算法,并使用 Kohli-Chen 角点检测算法; - `contours`:输出参数,保存检测到的轮廓; - `hierarchy`:输出参数,保存轮廓的层次结构信息; - `offset`:可选参数,轮廓偏移量。 例如,以下代码可以在二值图像中查找轮廓并绘制出来: ```python import cv2 as cv img = cv.imread('image.png') gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) ret, thresh = cv.threshold(gray, 127, 255, 0) contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) cv.drawContours(img, contours, -1, (0, 0, 255), 2) cv.imshow('Contours', img) cv.waitKey(0) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值