在OpenCV中,用findContours()函数从二值图中查找轮廓。
原型:
void findContourd(InputArray image, OutputArray contours, outputArray hierarchy, int mode, int mrthod, Point offset=Point())
参数详解:
- 第一个参数:输入图像,Mat类的对象即可,必须是8位单通道图像。图像的非零像素视为1,0像素值被保留为0,所以图像是二进制。我们可以使用compare()、inrange()、threshold()、adaptivethreshold()、canny()等桉树由彩色图像或灰度图创建二进制图像。此函数在提取图像轮廓饿同时,会修改图像的内容。
- 第二个参数:检测到的轮廓,每个轮廓存储为一个点向量,即用point类型的vector表示。
- 第三个参数:可选的输出向量,包含图像的拓扑信息。其作为轮廓的数量表示,包含了许多元素。每个轮廓contours[i]对应4个hierarchy元素的hierarchy[i][0]~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果没有对影项,则hierarchy[i]为负数。
- 第四个参数:int类型的mode,轮廓检索模式,包括以下几种:
- 第五个参数:int类型的method,表示轮廓的近似方法,取值如下:
- 第六个参数:Point类型的offset,每个轮廓点的可选偏移量,默认值是Point(),对ROI图像中找出的轮廓,并要在整个图像中进行分析时,这个参数便可派上用场。
findContours经常与drawContours一起使用,drawContours函数将检测到的轮廓绘制出来。
drawContours()函数
drawContours()函数用于在图像中绘制外部或者内部轮廓。
函数原型:
void drawContours(InputArray image, imputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArrayhierarchy=noArray(), int maxLevel=INT_MAX, Pointoffset=Point())
参数详解:
- 第一个参数:输入图像,Mat类的对象即可。
- 第二个参数:所有的输入轮廓,每个轮廓存储为一个点向量,即用point类型的vector表示。
- 第三个参数:int类型的contourIdx,轮廓绘制的只是变量,如果其为负值,则绘制所有的轮廓。
- 第四个参数:轮廓的颜色。
- 第五个参数:轮廓线条的粗细,默认值时1。
- 第六个参数:int类型的lineType,线条的类型,默认值8,取值如下:
- 第七个参数:InputArray类型的hierarchy,可选的层次结构信息,默认是noArray()。
- 第八个参数:int类型的maxLevel,表示用于绘制轮廓的最大等级,默认是INT_MAX。
- 第九个参数:Point类型的offset,可选的轮廓偏移参数。
调用示例:
Max result(image.size(),CV_8U, Scalar(255));
drawContours(results, contours,
-1, // 绘制所有的轮廓
Scalar(0), //颜色用黑色
3); // 线宽为3
代码示例:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
std::cout << "Hello, World!" << std::endl;
Mat srcImage;
srcImage = imread("/Users/dwz/Desktop/cpp/1.jpg");
Mat grayImage;
cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
grayImage = grayImage > 120;
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(grayImage, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
Mat dstImage = Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC3);
// drawContours(srcImage, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
int index = 0;
for (; index >= 0 ; index=hierarchy[index][0]) {
Scalar color(rand()&255, rand()&255, rand()&255);
drawContours(dstImage, contours, index,color, FILLED, 8, hierarchy);
}
imwrite("contours.jpg", dstImage);
return 0;
}
输入:
输出: