一个轮廓一般对应一系列的点,在opencv中,可以使用findContours()函数从二值图像素中查找轮廓
findContours
经常与drawContours
配合使用:使用findContours()函数检测到图像轮廓后,便可以用drawContours()函数将检测到的轮廓绘制出来。
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src=imread("1.jpg");
Mat src_gray,dst,abs_x;
imshow("原图",src);
//图像预处理
cvtColor(src,src_gray,COLOR_RGB2GRAY);
GaussianBlur(src_gray,dst,Size(5,5),10,10);
Canny(dst,dst,150,100,3);
vector<vector<Point>> contours;
vector<Vec4i> hierarcy;
findContours(dst, contours, hierarcy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
drawContours(src,contours,-1,Scalar(0,0,255));//第三个参数-1表示绘制所有轮廓
imshow("效果图",src);
waitKey(0);
return 0;
}
findContours函数解析
findContours(dst, contours, hierarcy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
- 第四个参数(RETR_EXTERNAL):轮廓检索模式,取值如下表所示
标识符 | 含义 |
---|---|
RETR_EXTERNAL | 表示只检测最外层轮廓,对所有轮廓,设置hierarcy[i][2]=hierarcy[i][3]=-1 |
RETR_LIST | 提取所有轮廓,并且放置在list中,检测的轮廓不建立等级关系 |
RETR_CCOMP | 提取所有轮廓,并且将其组织为双层结构:顶层为连通域的外围边界,次层为孔的内层边界 |
RETR_TREE | 提取所有轮廓,并重新建立网状的轮廓结构 |
- 第五个参数(CHAIN_APPROX_SIMPLE):轮廓近似办法,下表为轮廓可选的近似办法
标识符 | 含义 |
---|---|
CHAIN_APPROX_NONE | 获取每个轮廓的每个像素,相邻的两个点的像素位置不超过1,即max(abs(x1-x2),abs(y2-y1))==1 |
CHAIN_APPROX_SIMPLE | 压缩水平方向,垂直方向,对角线方向的元素,只保留方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息 |
CHAIN_APPROX_TC89_L1,CHAIN_APPROX_TC89_KCOS | 使用Teh-Chinl链逼近算法中的一个 |