1、查找图像轮廓
void findContours(InputArray image,OutputArray contours,OutputArray hierarchy,int mode,int method,Point offset=Point())
参数一:八位单通道图像阵列
参数二:保存函数运算后的结果
参数三:hierarchy[i][0]~hierarchy[i][3]分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有该选项则默认为-1
参数四:轮廓检索模式
RETR_EXTERNAL:只检测最外层轮廓,hierarchy[i][2]=hierarchy[i][3]=-1
RETR_LIST:提取所有轮廓,并且放在list中,轮廓间不建立 等级关系
RETR_CCMOP:提取所有轮廓,并且将其组织为双层结构:顶层为连通域的外围边界,次层为孔的内层边界
RETR_TREE:提取所有轮廓,并重新建立网状轮廓结构
参数五:轮廓近似办法
CHAIN_APPROX_NONE:获取每隔轮廓的每隔像素,相邻的两个像素位置差不超过1
CHAIN_APPROX_SIMPLE:压缩水平、垂直、对角元素,只保留该方向的终点坐标
CHAIN_APPROX_TC89L1
CHAIN_APPROX_TC89L_KCOS:使用teh-chinl链逼近算法中的一个
参数六:每隔轮廓点的可偏移量
2、绘制轮廓函数
void drawContours(InputArray dst,InputArray contours,int contourIdx,const Scalar &color,int thickness=1,int thicktype=8,InputArray hierarchy=noArray(),int maxLevel =INT_MAX,Point offset = Point() )
参数一:目标图像阵列(输出)
参数二:所有输入的轮廓,每隔轮廓存储一个点的向量
参数三:轮廓绘制指示变量,如果为负值则绘制所有轮廓
参数四:轮廓线的颜色
参数五:线的大小,可选FILLED填充轮廓内部
参数六:线的类型4,8,LINE_AA
参数七:可选层次结构信息
参数八:绘制轮廓的最大等级
参数九:轮廓的偏移量
pdf综合代码:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#define WINDOW_NAME1 "【原始窗口】"
#define WINDOW_NAME2 "【轮廓图】"
using namespace std;
using namespace cv;
Mat g_srcImage,g_grayImage;
int g_thresh = 80;
int g_thresh_max = 255;
RNG g_rng(12345);
Mat g_cannyMat_output;
vector< vector<Point> > g_vContours;
vector<Vec4i> g_vHierarchy;
void on_Thresh_Change(int,void *);
int main(int argc,char * argv[])
{
if(argc!=2)
{
cout<<"input error"<<endl;
return -1;
}
g_srcImage = imread(argv[1]);
if(g_srcImage.empty())
{
cout<<"read photo fail"<<endl;
return -1;
}
cvtColor(g_srcImage,g_grayImage,COLOR_BGR2GRAY);
blur(g_grayImage,g_grayImage,Size(3,3));
namedWindow(WINDOW_NAME1,WINDOW_AUTOSIZE);
namedWindow(WINDOW_NAME2);
imshow(WINDOW_NAME1,g_srcImage);
createTrackbar("canny检测",WINDOW_NAME2,&g_thresh,g_thresh_max,on_Thresh_Change);
on_Thresh_Change(0,0);
waitKey(0);
return 0;
}
void on_Thresh_Change(int,void *)
{
Canny(g_grayImage,g_cannyMat_output,g_thresh,g_thresh*2,3);
findContours(g_cannyMat_output,g_vContours,g_vHierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0)
);
Mat drawing = Mat::zeros(g_cannyMat_output.size(),CV_8UC3);
for(int i=0;i<g_vContours.size();i++)
{
Scalar color = Scalar(g_rng.uniform(0,255),g_rng.uniform(0,255),g_rng.uniform(0,255));
drawContours(drawing,g_vContours,i,color,2,8,g_vHierarchy,0,Point());
}
imshow(WINDOW_NAME2,drawing);
}
--------------(来自opencv3入门编程 毛星)