轮廓发现(find contour)
轮廓是图像的特征
首先了解一下轮廓的定义。一个轮廓代表一系列的点(像素)
这一系列的点构成一个有序的点集,所以可以把一个轮廓理解为一个有序的点集
轮廓不是边缘(轮廓是在边缘的基础上寻找的)
轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法
所以边缘提取的阈值选定会影响最终轮廓发现结果
2、API介绍
findContours发现轮廓
二值图像上发现轮廓使用API
findContours
(
InputOutputArray src,//输入图像,非0的像素被看成1,0的像素保持不变,8bits
OutputArray of Arrays contours,//全部发现的轮廓对象
OutputArray hierarchy,//图像的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现
int mode,//轮廓返回的模式 一般返回 去 的模式
int method,//发现方法
Point offset=Point()//轮廓像素的位移,默认(0,0)没有位移
)
drawContours绘制轮廓
对发现的轮廓进行绘制显示
drawContours
(
InputOutputArray,//绘制到输出图像
OutputArrays contours,//全部发现的轮廓对象
int contourldx,//轮廓索引号
const Scalar & color,//绘制颜色(可以每个轮廓都不一样的颜色)
int thickness,//绘制线宽
int lineType,//线的类型LINE_8
InputArray hierarchy,//拓扑结构图 可选层次信息结构,这里面是findContours所的到的基于Contours的层级信息
int maxlevel,//最大层数,0只绘制当前的,1表示绘制当前及其内嵌的轮廓
Point offset=Point()//轮廓位移,可选
)
3、步骤
输入图像转为灰度图像cvtColor
使用Canny进行边缘提取,取得二值图像
使用findContours寻找轮廓
使用drawContours绘制轮廓
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
Mat src, dst;
int thre=100;
int threMax = 255;
int RTER;
int CHAIN=1;
int MAX = 3;
void Contours(int, void*);
string convertToString(int d);//将double型数据转为字符型
int main()
{
src = imread("D:/实验台/机器视觉/测试图片/轮廓发现3.jpg");
if (src.empty())//如果src这个数据库属性为空
{
cout << "无法打开" << endl;
return -1;
}
imshow("原图", src);
//图片预处理 在二值化提取边缘之前进行高斯模糊和灰度化处理
GaussianBlur(src, src, Size(3, 3), 0, 0);
cvtColor(src, src, CV_BGR2GRAY);
namedWindow("轮廓发现",CV_WINDOW_AUTOSIZE);
createTrackbar