提取图像轮廓
学习【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
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;
}
效果图如下: