轮廓图像与 Canny 图像的区别 一个轮廓一般对应一系列的点,也就是图像中的一条曲线。轮廓图像和 Canny 图像乍看起来表现几乎是一致的,但其实组成两者的数据结构差别很大: 寻找轮廓:findContours 函数 findContours 函数用于在二值图像中寻找轮廓。 void findContours(InputArray image, OutputArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
vector<vector<Point> > contours
标识符 | 含义 | RETR_EXTERNAL | 只检测最外层轮廓,包含在外围轮廓内的内围轮廓被忽略。不存在父轮廓或内嵌轮廓 (hierarchy[i][2] = hierarchy[i][3] = -1)。
| RETR_LIST | 提取所有轮廓,并且放置在 list 中。不存在父轮廓或内嵌轮廓 (hierarchy[i][2] = hierarchy[i][3] = -1)。 再举个例子: | RETR_CCOMP | 提取所有轮廓,无论嵌套个数多少,都将其组织为双层结构(外层、内层)。 再举个例子: | RETR_TREE | 提取所有轮廓,并建立网状的轮廓结构(最外层轮廓为根)。 再举个例子: |
标识符 | 含义 | CHAIN_APPROX_NONE | 获取每个轮廓的每个像素,相邻的两个像素位差不超过 1 像素。 | CHAIN_APPROX_SIMPLE | 仅保存轮廓的拐点信息,拐点与拐点之间直线段上的信息点不予保留。例如一个矩形轮廓只需 4 个点来保留轮廓信息。 | CHAIN_APPROX_TC89_L1 CHAIN_APPROX_TC89_KCOS | 使用 teh-Chinl chain 近似算法。 |
绘制轮廓:drawContours 函数 void drawContours(InputOutputArray image, InputOutputArrays contours, int contourIdx, const Scalar& color, int thickness = 1, int lineType = 8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point());
image,目标图像,填 Mat 类对象即可。 contours,输入的轮廓,每个轮廓都是一组点集,可用 Point 类型的 vector 表示。 contourIdx,轮廓的索引编号。若为负值,则绘制所有轮廓。 color,轮廓颜色。 thickness,轮廓线条的粗细程度,有默认值 1。若其为负值,便会填充轮廓内部空间。 lineType,线条的类型,有默认值 8。可去类型如下:
类型 | 含义 | 8 | 8 连通线型 | 4 | 4 连通线型 | LINE_AA | 抗锯齿线型 |
hierarchy,可选的层次结构信息,有默认值 noArray()。 maxLevel,用于绘制轮廓的最大等级,有默认值 INT_MAX。 offset,轮廓信息相对于目标图像对应点的偏移量,相当于在每一个轮廓点上加上该偏移量,有默认值 Point() 。在 ROI 区域(感兴趣区域)绘制轮廓时,这个参数便可派上用场。
代码示例: #include<opencv.hpp>
#include<iostream>
#include<vector>using namespace std;using namespace cv;int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/3.jpg");
imshow("src", src);
Mat canny_img;
Canny(src, canny_img, 55, 110, 3);//闭操作,先膨胀后腐蚀,可消除小黑点Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(canny_img, canny_img, MORPH_CLOSE, kernel);
imshow("canny_img", canny_img);
Mat dst = Mat(src.rows, src.cols, CV_8UC3, Scalar(0, 0, 0));
vector<vector<Point> >contours; ////写法一//vector<Vec4i>hierarchy;//
findContours(canny_img, contours,hierarchy, RETR_TREE, CHAIN_APPROX_NONE);//for (int i = 0; i < contours.size(); i++) {// drawContours(dst, contours, i, Scalar(0, 0, 255), 1, 8, hierarchy);//} //写法二findContours(canny_img, contours, RETR_TREE, CHAIN_APPROX_NONE);
drawContours(dst, contours, -1, Scalar(0, 255, 0), 1);
imshow("dst", dst);
waitKey(0);
} 效果演示:
借鉴博客:https://www.cnblogs.com/GaloisY/p/11062065.html https://blog.csdn.net/qq_35239859/article/details/99676501
|