首先创建一个窗口用来显示图像,滑动条(trackbar)用来设置阈值,然后对灰度图像提取轮廓,并绘制轮廓。当控制参数的滑动条变化时,图像被更新。
#include <opencv2\opencv.hpp>
#include <stdio.h>
IplImage *g_image = NULL;
IplImage *g_gray = NULL;
//设置初始阈值
int g_thresh = 100;
//创建序列指针
CvMemStorage *g_storage = NULL ;
//回调函数
void on_trackbar(int )
{
//若序列为空,则创建图像g_gray,创建序列,默认大小(64KB)。否则清空内存存储器
if(g_storage ==NULL)
{
g_gray = cvCreateImage(cvGetSize(g_image),8,1);
g_storage = cvCreateMemStorage(0);
}
else
{
cvClearMemStorage(g_storage);
}
//创建序列指针,用来查找轮廓
CvSeq* contours = 0 ;
//转换图像
cvCvtColor(g_image,g_gray,CV_BGR2GRAY);
//阈值化
//阈值越大,轮廓越多
cvThreshold(g_gray,g_gray,g_thresh,255,CV_THRESH_BINARY);
//查找轮廓,contours指向轮廓
cvFindContours(g_gray,g_storage,&contours);
//清零图像
cvZero(g_gray);
if(contours)
{
//绘制轮廓
cvDrawContours(g_gray,contours,cvScalarAll(255),cvScalarAll(255),100);
cvShowImage("Contours",g_gray);
}
}
int main(int argc,char arg[])
{
//读取源图像
g_image = cvLoadImage("1.jpg",1);
cvNamedWindow("Contours",1);
//创建滚动条
cvCreateTrackbar("Threshold","Contours",&g_thresh,255,on_trackbar);
on_trackbar(0);
cvWaitKey(0);
return 0 ;
}