一、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 <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.运行结果