目录
想要实现轮廓检测,首先需要对图像进行预处理。依次为:
图像灰度化、高斯模糊、Canny边缘检测、膨胀 。
上述函数的使用可以查阅:
然后,用函数 findContours() 检测轮廓。
最后,用函数 drawContours() 绘制轮廓。
- void cv::findContours
- (
- InputArray image,
- OutputArrayOfArrays contours,
- OutputArray hierarchy,
- int mode,
- int method,
- Point offset = Point()
- )
image | 源图像(8位,单通道) 非零像素视为1,零像素视为0。 |
contours | 用于储存检测到的轮廓 (由 点 构成 轮廓,由 轮廓 构成 轮廓的集合) |
hierarchy | 集合(包含所有图形的拓扑信息) |
mode | 轮廓的检索模式 ● RETR_EXTERNAL 只检测最外层轮廓 ● RETR_LIST 提取所有轮廓(不建立等级关系) ● RETR_CCOMP 提取所有轮廓(只建立两个等级关系) ● RETR_TREE 提取所有轮廓(建立完成的等级关系) ● RETR_FLOODFILL 洪水填充法 |
method | 轮廓近似方法 CHAIN_APPROX_NONE 保存物体边界上所有连续的点 CHAIN_APPROX_SIMPLE 压缩,只保留终点坐标(例如,矩形只保存4个顶点的坐标信息) CHAIN_APPROX_TC89_L1 使用Teh-Chin 链近似算法 CHAIN_APPROX_TC89_KCOS 使用Teh-Chin 链近似算法 |
offset | 轮廓偏移量 |
- void cv::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()
- )
image | 目标图像(绘制图形的画板,一般使用进行检测的初始图像。) |
contours | 所有需要进行绘制的轮廓(即 findContours() 中的 contours) |
contourIDx | 绘制轮廓的参数(如果为负值,则绘制所有轮廓) |
color | 轮廓的颜色 |
thickness | 轮廓的等距厚度(若 thickness=FILLED,则对轮廓线进行填充) |
lineType | 轮廓线的线型 |
hierarchy | 层次结构的可选信息(当只想绘制部分轮廓时,需要此选项) |
maxlevel | 轮廓的绘制级别(层次结构信息存在时,执行此参数) ● 如果为0,则仅绘制指定的轮廓。 ● 如果为1,该函数将绘制轮廓和所有嵌套轮廓。 ● 如果为2,则函数将绘制轮廓、所有嵌套轮廓、所有从嵌套到嵌套的轮廓等等。 |
offset | 轮廓偏移量 |
- #include "widget.h"
- #include "ui_widget.h"
-
- #include <QDebug>
-
- #include <opencv2/core/core.hpp>
- #include <opencv2/highgui/highgui.hpp>
- #include <opencv2/imgproc/imgproc.hpp>
-
- #include <vector>
-
- using namespace cv;
- using namespace std;
-
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
-
- //定义输入和输出图像
- Mat src;
- Mat dst_gray,
- dst_blur,
- dst_canny,
- dst_dilate,
- dst;
-
- //载入图像
- src = imread("c:/opencv/x6.bmp");
- //显示
- imshow("src",src);
-
- //灰度处理
- cv::cvtColor(src,dst_gray,COLOR_BGR2GRAY);
- //显示
- imshow("dst_gray",dst_gray);
-
- //高斯模糊
- GaussianBlur(dst_gray,dst_blur,Size(3,3),0,0);
- //显示
- imshow("dst_blur",dst_blur);
-
- //边缘检测
- Canny(dst_blur,dst_canny,200,220);
- //显示
- imshow("dst_canny",dst_canny);
-
- //膨胀
- dilate(dst_canny,dst_dilate,Mat());
- //显示
- imshow("dst_dilate",dst_dilate);
-
- //克隆
- Mat src_find = src.clone();
- //检测轮廓
- vector<vector<Point>> contours;
- findContours(dst_dilate,contours,RETR_LIST,CHAIN_APPROX_SIMPLE);
- //绘制轮廓
- drawContours(src_find,contours,-1,Scalar(255,0,255),FILLED);
- //显示
- imshow("src_find",src_find);
-
-
- }
-
- Widget::~Widget()
- {
- delete ui;
- }
opencv学习(四十)之寻找图像轮廓findContours()