提取图像轮廓--findContours函数、drawContours函数

提取图像轮廓

 

学习【OpenCV入门教程之六】创建Trackbar & 图像对比度、亮度值调整---记录

今天学习到@浅墨_毛星云博主的学习【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整,再此我将自己遇到的问题进行记录

中间引用了一些博客的内容:

http://blog.csdn.net/dcrmg/article/details/51987348

http://blog.csdn.net/ly19921103/article/details/51553564

http://blog.sina.com.cn/s/blog_59fabe030101ib67.html

非常感谢~

提取图像轮廓的2个步骤

1、  findContours函数找轮廓,

2、 drawContours函数画轮廓

 

而findContours函数找轮廓,其中源图像需要一个二值图像,这个过程需要OpenCV的两个函数:

1)、彩色图像转化为灰度图像:cvtColor函数;

2)、由灰度图转化为二值图像函数:threshold函数。

既然说到了这两个函数,就说说这两个函数的用法吧。

cvtColor函数:

void cvtColor(InputArray src, OutputArray dst,int code, int dstCn=0 ) 

src和dst分别是待转的图像(src)和待转图像转换后的图像(dst);code是一个掩码,表示由src到dst之间是怎么转的,比如是彩色转为灰度,还是彩色转为HSI模式;最后的dstCn表示dst图像的波段数,这个值默认是0,它可以从参数code中推断。

code的模式包括:

CV_RGB2GRAY:<彩色图像---灰度图像>

CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR,CV_YCrCb2RGB     

CV_BGR2HSV, CV_RGB2HSV,CV_HSV2BGR, CV_HSV2RGB

threshold函数:

double threshold(InputArray src, OutputArraydst, double thresh, double maxval, int type) 

src和dst分别是待处理的图像(src)和由src生成的二值图像(dst);thresh是阈值,所谓的阈值函数就肯定要有个阈值;maxval是像素最大值,type就是模式了。

 

上面已经将彩色图像转换成二值图像了,

接下来真正用findContours提取轮廓:它的输入图像是一幅二值图像,输出的是每一个连通区域的轮廓点的集合:vector> contours。外层vector的size代表了图像中轮廓的个数,里面vector的size代表了轮廓上点的个数。

drawContours用来画提取的轮廓。

下面我们通过实例来看函数的用法。

#include
#include
#include
#include

using namespace cv;
using namespace std;

int main()
{
Mat image=imread("img/logo.png",1);
	//将image由彩色图像转换成灰度图像
	cvtColor(image,image,CV_BGR2GRAY);
	//再通过阈值函数将其转换为二值图像
	threshold(image,image,160,255,THRESH_BINARY);//设置阈值为160,最大像素值为255
	vector> contours;
	//find轮廓
	findContours(image,contours,1,CHAIN_APPROX_SIMPLE);
	//draw轮廓
	Mat result=Mat::zeros(image.size(),CV_8UC1);
	if(!contours.empty())
	{
		//result:存放轮廓,contours:找到的轮廓,-1:将所有轮廓画出,Scalar(255):白色画笔,2:为画笔粗细
	drawContours(result,contours,-1,Scalar(255),2);
	imshow("处理图",result);
	}
	waitKey();
	return 0;
}

原图如下:

提取图像轮廓--findContours函数、drawContours函数_第1张图片

效果图如下:

提取图像轮廓--findContours函数、drawContours函数_第2张图片

你可能感兴趣的:(Opencv)