查找轮廓并绘制

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入门编程 毛星)

猜你喜欢

转载自blog.csdn.net/gg101001/article/details/79577986