1)什么是轮廓
轮廓可以简单的认为是将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度,提取轮廓就是提取这些具有相同颜色或者灰度的曲线,或者说是连通域,轮廓在形状分析和物体的检测和识别中非常有用

注意事项:
1.为了更加准确,要使用二值化图像,在寻找轮廓之前,要进行阈值化处理或者Canny边缘检测
2.查找轮廓的函数会修改原始图像,如果你在查找轮廓之后还想使用原始图像的话,应该将原始图像储存到其他变量中(clone(),copyTo())
3.在Opencv中,查找轮廓就像是在黑色背景中找白色物体,你应该记住,要找的物体应该是白色而背景应该是黑色
常用函数:
findContours()—-查找轮廓
drawContours()—–绘制轮廓

查找轮廓—findConturs()
void findContours(InputOutArray image,OutputArrayOfArrays contours,OutputArray hierarchy,int mode,int method,Point offset=Point());
&&image:输入图像,Mat类型8位单通道图像(一般为二值图 )
&&contours:检测到的轮廓,每个轮廓存储为一个点向量,即Point类型的vector表示
&&hierarchy:可选择的输出变量,包含图像的拓扑信息,其作为轮廓数量的表示,包含了很多元素,每个轮廓contours[i]对应4个hierarchy元素
hierarchy[i][0]–hierarchy[i][3],分别表示后一轮廓,前一轮廓,父轮廓,内嵌轮廓的索引编号,如果没有对应项,设置为负数
&&mode:轮廓检索模式 取值如下:
CV_RETR_EXTERNAL=0—-表示只检测最外层轮廓
CV_RETR_LIST=1———-提取所有轮廓并放置在list中,轮廓不建立等级关系
CV_RETR_CCOMP=2——提取所有轮廓并组织为双层结构
CV_RETR_TREE=3———提取所有轮廓并重新建立网状轮廓结构
&&method :轮廓的近似方法 取值如下
CV_CHAIN_APPROX_NONE 连续存储所有的轮廓点,任何两个相邻的点都是水平,垂直或者斜相邻的
CV_CHAIN_APPROX_SIMPLE 压缩存储,对于水平,垂直或者斜向的线段,只会保存端点,比如一个四边形 只会存储四个端点
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS
ex1:
vector< vector /Point> contours;
vector /Vec4i> hierarchy;
findContours(img,contours,hierarchy,CV_RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);

绘制轮廓—–drawContours()
void drawContours(InputOutArray 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:目标图像,Mat类型对象即可
&&contours:所有的轮廓指示变量(索引),若为负值,则表示绘制所有轮廓
&&color:绘制轮廓的颜色
&&thickness:轮廓线条的粗细,默认值1,如果为负值,则绘制轮廓内部,可选宏CV_FILLED
&&lineType:线条类型,默认值8
&&hirearcy:可选的层次变量,默认值noArray()
&&maxLevel:可以用于绘制轮廓的最大等级,默认值INT_MAX
&&offset:可选的轮廓偏移参数,默认值Point()
ex1:
drawContours(result,contours,-1,Scalar(0,255,0),1,8);

#include"opencv2/opencv,hpp"
#include<iostreeam>
using namespace std;
using namespace cv;
void mian()
{
  Mat srcImg=imread("01.jpg");
  Mat tempImg=srcImg.clone();
  Mat draw(srcImg.rows,srcImg.cols,CV_8UC3);
  cvtColor(srcImg,srcImg,CV_BGR2GRAY);//转成灰度图
  threshold(srcImg,srcImg,100,255,CV_THRESH_BINARY);
  imshow("srcImg",srcImg);//轮廓查找前
  vector<vector<Point>>contours;
  vector<Vec4i>hierarcy;
  findContours(srcImg,contours,hierarcy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);//查找轮廓

  imshow("cont",srcImg); //轮廓查找后
drawContours(draw,contours,-1,Scalar(0,255,0),2,8);//绘制轮廓
imshow("contours",draw);
//-1表示画全部轮廓0表示画第一个轮廓
count<<"num="<<contours.size()<<endl;//输出轮廓个数
  waitKey(0);
}

//道路的裂缝检测