openCV学习笔记(3):opencv轮廓检测应用例子

一、openCV学习系列笔记请参考:http://blog.csdn.net/chentravelling/article/category/2843741【不断更新】

一、以下链接是轮廓检测中一些函数的原理讲解。

cvFindContours()函数原理。

cvDrawContours()函数原理。

二、新建项目

1.配置环境,请参考:http://blog.csdn.net/chentravelling/article/details/42816965

2.将图片放在目录下,请参考:http://blog.csdn.net/chentravelling/article/details/42816965【一定要注意图片地址,否则代码中请使用图片的绝对路径加载图片】

      ps:为了效果直观,图片尽量简单,轮廓清晰较好。

3.代码:

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
//                                                 //
//     ^^^^^^^轮廓检测cvFindContours()^^^^^^^      //
//                                                 //
//^^^^^^^^^^^^^^^^^^^^By Code陈^^^^^^^^^^^^^^^^^^^^//

#include 
#include 
#include 
using namespace cv;
using namespace std;

const char *OriginalWindowsName = "Original Image - code 陈/http://bolg.csdn.net/chentravelling";
const char *BinaryWindowsName = "Binary Image - code 陈/http://blog.csdn.net/chentravelling";
const char *ContourWindowsName = "Contour Image - code 陈/http://blog.csdn.net/chentravelling";
const char *TrackbarName = "Threshold";
//指向原图的指针
IplImage *OriginalImage = NULL;
//指向灰度图的指针
IplImage *GrayImage = NULL;
//指向二值化图的指针
IplImage *BinaryImage = NULL;
//指向轮廓图的指针
IplImage *ContourImage = NULL;
//当滑条发生变化时执行的回调函数
CvSeq *PSeq = NULL;
void on_trackbar(int value)
{
	//将灰度图二值化
	BinaryImage = cvCreateImage(cvGetSize(GrayImage),IPL_DEPTH_8U,1);
	cvThreshold(GrayImage,BinaryImage,value,255,CV_THRESH_BINARY);
	//显示二值化图像
	cvShowImage(BinaryWindowsName,BinaryImage);

	CvMemStorage *MStorage = cvCreateMemStorage();
	//轮廓检索
	cvFindContours(BinaryImage,MStorage,&PSeq);

	IplImage *ContourImage = cvCreateImage(cvGetSize(GrayImage),IPL_DEPTH_8U,3);
	int level = 5;
	cvZero(ContourImage);
	cvDrawContours(ContourImage,PSeq,CV_RGB(255,0,0),CV_RGB(0,255,0),level);
	cvShowImage(ContourWindowsName,ContourImage);

	cvReleaseMemStorage(&MStorage);
	cvReleaseImage(&BinaryImage);
	cvReleaseImage(&ContourImage);
}
int main()
{
	//加载原始图片
	OriginalImage = cvLoadImage("1.jpg",1);
	
	//创建原始图像窗口OriginalWindow
	cvNamedWindow(OriginalWindowsName,0);
	//显示原始图片
	cvShowImage(OriginalWindowsName,OriginalImage);

	//将原始图片转成灰度图像
	GrayImage = cvCreateImage(cvGetSize(OriginalImage),IPL_DEPTH_8U,1);
	cvCvtColor(OriginalImage,GrayImage,CV_BGR2GRAY);
	
	//创建二值化图像窗口
	cvNamedWindow(BinaryWindowsName,0);
	//创建轮廓图窗口
	cvNamedWindow(ContourWindowsName,0);

	//创建滑条
	int Threshold = 0;
	cvCreateTrackbar(TrackbarName,BinaryWindowsName,&Threshold,254,on_trackbar);

	on_trackbar(1);

	cvWaitKey();

	cvDestroyWindow(OriginalWindowsName);
	cvDestroyWindow(BinaryWindowsName);
	cvDestroyWindow(ContourWindowsName);
	cvReleaseImage(&OriginalImage);
	cvReleaseImage(&BinaryImage);

	return 0;
}


4.运行结果

openCV学习笔记(3):opencv轮廓检测应用例子_第1张图片


你可能感兴趣的:(【图像处理】,图像处理,opencv,轮廓检测,图像处理)