虽然Canny之类的边缘检测算法可以根据像素间的差异检测出轮廓边界的像素,但是它并没有将轮廓作为一个整体。下一步是要把这些边缘像素组装成轮廓。而对于这一步的实现,OpenCV自带了函数cvFindContours()和cvDrawContours(),这两个函数主要的作用就是检测轮廓,并把检测到的轮廓画出来。
下面先给出个完整的轮廓检测示例,然后我们再结合这个程序示例,解释相关的函数。
#include<opencv2/opencv.hpp>
using namespace std;
IplImage *g_pGrayImage = NULL;
const char *windows1 = "二值图";
const char *windows2 = "轮廓图";
CvSeq *g_pcvSeq = NULL;
//进度条回调函数
void on_trackbar(int pos)
{
IplImage *pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);
cvThreshold(g_pGrayImage, pBinaryImage, pos, 255, CV_THRESH_BINARY);//转化为二值化图像
cvShowImage(windows1, pBinaryImage);//显示二值化图像
CvMemStorage *cvMStorage = cvCreateMemStorage();//创建内存存储器
cvFindContours(pBinaryImage, cvMStorage, &g_pcvSeq);//检测轮廓并返回检测到的轮廓的个数