opencv 中利用函数 findContours() 可以监测出物体的轮廓
drawContours() 可以画出物体的轮廓
- findContours()函数源码
void findContours(InputArray image, OutputArrayOfArrays contours,
OutputArray hierarchy, int mode,
int method, Point offset = Point());
image ,8位单通道图像。 非零像素被视为1。 零像素保持为0,因此图像被视为二值。
可以使用compare、inRange、threshold、adaptiveThreshold、Canny和
其他方法来从灰度或彩色图像创建二值图像。
contours 监测到的轮廓 原型 vector contours;
每个轮廓线存储为一个点的向量
hierarchy 可选输出向量 原型vector hierarchy;
model 定义轮廓的检索模式RETR_EXTERNAL 只监测最外围轮廓
RETR_LIST 检测所有轮廓
method 定义轮廓的近似方法CHAIN_APPROX_NONE 保存物体所有连续的轮廓点到contours向量内
CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息 拐点与拐点直接的信息不保留
point 偏移量
- drawContours()函数源码
void drawContours(InputOutputArray image, InputArrayOfArrays contours,
int contourIdx, const Scalar& color,
int thickness = 1, int lineType = LINE_8,
InputArray hierarchy = noArray(),
int maxLevel = INT_MAX, Point offset = Point());
imgae 目标图像
contours 所有的输入轮廓。 每条轮廓线存储为一个点向量。
contouridx要绘制的轮廓参数。 如果它是负的,就画出所有的等高线。
color 颜色
thickness 宽度 如果是负数 表示填充轮廓内部
lineType 线型
hierarchy可选信息。 它只在你想绘制一些轮廓时才需要(参见maxLevel)。
maxlevel绘制轮廓的最大水平。 如果为0,则只绘制指定的轮廓。
如果为1,函数绘制轮廓线和所有嵌套轮廓线。
如果是2,该函数绘制等值线、所有嵌套等值线、所有嵌套到嵌套等值线,等等。
只有当存在可用的层次结构时,才会考虑此参数。
offset 可选轮廓偏移参数。 将所有绘制的等高线按指定偏移量(dx, dy)移动。
3 代码
int main()
{
Mat image, img2;
img2 = imread("2_3.jpg", 0);
GaussianBlur(img2, image, Size(3, 3), 0);
//高斯 Canny(image, image, 100, 250);
//二值化 vector contours;
vector hierarchy;
//3.利用函数findContours()查找图像A的轮廓;
findContours(image, contours, hierarchy, RETR_LIST, CHAIN_APPROX_NONE, Point());
Mat imageContours = Mat::zeros(image.size(), CV_8UC1);
Mat Contours = Mat::zeros(image.size(), CV_8UC1);
//绘制 for (int i = 0;
i < contours.size();
i++)
{
//contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数
for (int j = 0;
j < contours[i].size();
j++)
{
//绘制出contours向量内所有的像素点
Point P = Point(contours[i][j].x, contours[i][j].y);
Contours.at(P) = 255;
//白色像素点
}
}
//绘制轮廓
drawContours(imageContours, contours, -1, Scalar(255));
imshow("Contours Image", imageContours);
//轮廓 imshow("Point of Contours", Contours);
//向量contours内保存的所有轮廓点
waitKey(0);
}
4 method 参数对比
4.1 CHAIN_APPROX_NONE 保存物体所有连续的轮廓点到contours向量内
文章图片
4.2 CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息 拐点与拐点直接的信息不保留
【opencv|opencv 学习笔记(五) findContours() 函数与drawContours() 函数】
文章图片
推荐阅读
- opencv|opencv学习笔记(四) 绘制几何图形
- opencv|opencv 学习笔记(六) 一周总结
- opencv|opencv学习笔记(三)颜色转换 cvtColor
- opencv|opencv 图片上画一条线
- opencv|opencv 学习笔记(一) 矩阵构造之输出
- 《C++要笑着学》|【C++要笑着学】从零开始实现日期类 | 体会代码的复用 | 提供完整代码
- 《C语言杂俎》|【C++】几道关于this指针的面试题
- 小问《Essential|《Essential C++》笔记之漫游(面向对象编程思维)
- 《C++要笑着学》|C++要笑着学(面向对象(下))