计算机视觉-OpenCV-Android---轮廓发现与绘制

294 阅读3分钟

有时候,我们希望Canny边缘提取出来的结果是图像的完整轮廓,但是有时候Canny提供给我们的却是一些边缘像素信息,并没有向我们提供完整的轮廓上每个点的位置信息,而OpenCV中还有一组函数可以帮助我们发现每个轮廓、绘制轮廓或者它的外接矩形。下面就来一一介绍这组有用的函数,它们对于移动端的图像处理是非常有用的。1.轮廓发现 图像的轮廓一般都是由一系列的像素点组成的,这些像素点一般是属于二值图像的前景对象,每一个轮廓都是一组点,从这些点还可以看出一条曲线上的其他各个点。假设二值图像中有多个轮廓,则会生成多个轮廓的描述数组,OpenCV中轮廓发现的理论是基于一篇拓扑结构分析的论文发展而来的,其主要是通过定义一系列的边缘点类型与拓扑几何结构类型,然后通过对二值图像的扫描来完成边缘点类型的寻找与拓扑结构的构建,并以此完成轮廓发现。相关API与参数解释,API实现支持TREE与LIST两种拓扑结构返回。

  • findContours(Mat image, List<MatOfPoint> contours, Mat hierarchy, int mode, int method, Point offset) image:输入图像,必须是8位的单通道的图像,轮廓发现的时候该图像会被修改。 contours:是List类型,List里面的每个元素都是一个轮廓对应的所有像素点集合。 hierarchy:拓扑信息,可以不填写这个参数。 mode:返回的轮廓拓扑模式,一共有四种。 method:描述轮廓的方法,一般是基于链式编编码。 ·offset:是否有位移,默认都是各个像素点没有相对原因的位置移动,所以位移默认是(0,0)。 返回的轮廓拓扑的四种模式,具体如下。 ·RETR_EXTERNAL=0:表示获取最外层最大的轮廓。 ·RETR_LIST=1:表示获取所有的轮廓,轮廓是按LIST队列顺序组织的。 ·RETR_CCOMP=2:表示获取所有轮廓呈现的双层结构组织,第一层是外部边界,第二层是孔边界。 ·RETR_TREE=3:表示对获取的轮廓按照树形结构进行组织,显示出归属与嵌套层次。 链式编码的方式有四种,具体如下。 ·CHAIN_APPROX_NONE=1:将链式编码中的所有点都转换为点输出。 ·CHAIN_APPROX_SIMPLE=2:压缩水平、垂直、倾斜部分的轮廓点输出。 ·CHAIN_APPROX_TC89_L1=3:使用Teh-Chin链式逼近算法中的一种。 ·CHAIN_APPROX_TC89_KCOS=4:使用Teh-Chin链式逼近算法中的一种。 创建的上述两个参数常为RETR_EXTERNAL和CHAIN_APPROX_SIMPLE或者RETR_TREE和CHAIN_APPROX_SIMPLE。2.轮廓绘制 对发现的轮廓LIST对象使用循环可以遍历每个轮廓,对每个轮廓都可以使用OpenCV已经提供的API绘制各个轮廓,绘制轮廓API及其参数解释如下: drawContours(Mat image, List contours, int contourIdx, Scalar color, int thickness) ·image:要绘制轮廓的图像,通常可以创建一张空白的黑色背景图像。 ·contours:轮廓数据来自轮廓发现函数输出。 ·contourIdx:声明绘制第几个轮廓。