第8章 图像轮廓与图像分割修复
8.1 查找并绘制轮廓
8.1.1 寻找轮廓:findContours()函数
1.作用:在二值图像中寻找轮廓
2.函数原型:
void findcontours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
3.参数说明:
(1)输入图像,8位单通道图像,图像非零像素被保留为0,所以图像为二进制,可以使用cmopare()、inrange()、threshold()、adaptivethreshold()、canny()等函数由灰度图或彩色图创建二进制图像
(2)检测到的轮廓,每个轮廓存储为一个点向量,即用point类型的vector表示
(3)可选的输出向量,包含图像的拓扑信息,作为轮廓数量的表示,每个轮廓contours[i]对应4个hierarchy元素,contours[i][0]~contours[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,对应的hierarchy[i]值设为负数
(4)轮廓检索模式,取值:
(5)轮廓近似办法,取值:
(6)每个轮廓点的可选偏移量,默认值Point()
4.示例:
vector<vector<Point>>contours;
findContours(image,contours,RETR_EXTERNAL,CHAIN_APPROX_NONE);
8.1.2 绘制轮廓:drawContours()函数
1.作用:用于在图像中绘制外部或内部轮廓
2.函数原型:
void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point())
3.参数说明:
(1)目标图像
(2)输入轮廓
(3)轮廓绘制指示变量,负值表示绘制所有轮廓
(4)轮廓颜色
(5)轮廓线条粗细度,默认值1,负值会绘制在轮廓内部
(6)线条类型,默认8,可取值:
(7)可选的层次结构信息,默认值noArray()
(8)用于绘制轮廓的最大等级,默认值INT_MAX
(9)可选的轮廓偏移参数,默认Point()
4.示例:
Mat result(image.size(),CV_8U,cv::Scalar(255));
drawContours(result,contours,-1,Scalar(0),3,8);
8.1.3 示例程序
1.查找并绘制轮廓示例
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
//以二值图模式载入并显示原图
Mat srcImage = imread(