不同于边缘检测,轮廓查找将梯度突变的连续点集作为一个整体进行存储,这也是轮廓与边缘的区别:边缘为离散点,轮廓为多个点集。
下面的代码实现了轮廓查找与绘制,结合滚动条功能方便阈值调节。
由于阈值调节过程中会不断调用回调函数,因此可能出现stack overflow的错误,建议将vs中“堆栈保留大小”调大:
代码:
// 轮廓查找
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;
//宏定义
#define IMAGE_NAME "image2.jpg"//输入图片名
#define WINDOW_NAME "轮廓查找"//创建的窗口名
#define BAR_NAME "阈值"//滚动条名称
//全局变量
const int BAR_MAX = 50;//滚动条上限
int Bar_Value = 33;//滚动条变量
Mat image;//原图
Mat tmp_image;//临时图,阈值化后的二值图
Mat output_image;//输出图
RNG g_rng(time(0));//随机数
/*回调函数会重复调用,因此将变量在外部申明可以节省内存*/
//定义轮廓与层次结构
vector<vector<Point>> contours;
ve