轮廓查找及绘制

  • 轮廓查找

  轮廓查找是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果,下图为提取图像的轮廓效果。

  • 凸包

  在一个多边形边缘或者内部任意两个点的连线都包含在多边形边界或者内部,包含点集合S中所有点的最小凸多边形称为凸包。

  • Graham扫描算法

  首先选择Y方向最低的点作为起始点p0,从p0开始极坐标扫描,依次添加p1….pn(排序顺序是根据极坐标的角度大小,逆时针方向)对每个点pi来说,如果添加pi点到凸包中导致一个左转向(逆时针方法)则添加该点到凸包, 反之如果导致一个右转向(顺时针方向)删除该点从凸包中。下图中的2在C点已经不符合要求,因为是一个右拐点。

   下图为凸包的显示效果:

  • 轮廓周围绘制矩形和凸包

  基于RDP算法实现,目的是减少多边形轮廓点数,首先将图像变为二值图像,发现轮廓,找到图像轮廓,使用多边形不断逼近轮廓,通过相关API在轮廓点上找到最小包含矩形和圆,旋转矩形与椭圆。

 相关API:

 1 轮廓查找:findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); 
 2 //canny_output输入图像为边缘检测后的图像,非0的像素被看成1,0的像素值保持不变,8-bit,contours为全部发现的轮廓对象,
 3 //hierachy该图的拓扑结构。RETR_TREE轮廓返回的模式,CHAIN_APPROX_SIMPLE发现方法,Point(0, 0)轮廓像素的位移,默认(0, 0)没有位移。
 4 
 5 轮廓绘制:drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0)); 
 6 //dst输出图像 ,contours全部发现的轮廓对象i 轮廓索引号 color 绘制时候颜色。
 7 //2绘制线宽, 8线的类型LINE_8, hierachy拓扑结构图,0,最大层数, 0只绘制当前的,1表示绘制绘制当前及其内嵌的轮,Point(0, 0)廓轮廓位移。
 8 
 9 凸包寻找:convexHull(contours[i], convexs[i], false, true); 
10 //contours[i]为输入候选点,来自findContours轮廓查找, convexs[i]为凸包, false为逆时针方向, true表示返回点个数。
11 
12 多边形逼近:approxPolyDP(Mat(contours[i]),contours_ploy[i],3,true);
13 //Mat(contours[i])为输入的多边形序列,contours_ploy[i]输出的多边形序列和输入序列要保持同一种类型。
14 //3为逼近的准确度,true用来设置形成的多边形是否是闭合的。
15 
16 获得最小包围圆:minEnclosingCircle(contours_ploy[i], ccs[i], radius[i]);
17 //输入曲线的一系列点的集合,ccs[i]为输出点的集合,radius[i]为半径序列。

猜你喜欢

转载自www.cnblogs.com/fuzhuoxin/p/12171004.html