一、openCV学习系列笔记请参考:http://blog.csdn.net/chentravelling/article/category/2843741【不断更新】
一、以下链接是轮廓检测中一些函数的原理讲解。
二、新建项目
1.配置环境,请参考:http://blog.csdn.net/chentravelling/article/details/42816965
2.将图片放在目录下,请参考:http://blog.csdn.net/chentravelling/article/details/42816965【一定要注意图片地址,否则代码中请使用图片的绝对路径加载图片】
ps:为了效果直观,图片尽量简单,轮廓清晰较好。
3.代码:
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
// //
// ^^^^^^^轮廓检测cvFindContours()^^^^^^^ //
// //
//^^^^^^^^^^^^^^^^^^^^By Code陈^^^^^^^^^^^^^^^^^^^^//
#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
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.运行结果