二十七、轮廓发现
1、轮廓发现(find contour)
- 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现结果。
2、API介绍
findContours
发现轮廓
二值图像上发现轮廓使用API
findContours(
InputOutputArray src,//输入图像,非0的像素被看成1,0的像素保持不变,8bits
OutputArray of Arrays contours,//全部发现的轮廓对象
OutputArray hierachy,//图像的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现
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,//拓扑结构图
int maxlevel,//最大层数,0只绘制当前的,1表示绘制当前及其内嵌的轮廓
Point offset=Point()//轮廓位移,可选
)
3、步骤
- 输入图像转为灰度图像
cvtColor
- 使用
Canny
进行边缘提取,取得二值图像 - 使用
findContours
寻找轮廓 - 使用
drawContours
绘制轮廓
示例代码:(发现轮廓)
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int threshold_value = 100;
int threshold_max = 255;
RNG rng;
void Demo_Contours(int, void*);
char output_win[] = "output image";
Mat src, dst;
int main(int argc, char** argv) {
src = imread("添加图片路径");
if (!src.data) {
cout << "could not load image..." << endl;
return -1;
}
imshow("input image", src);
namedWindow(output_win, WINDOW_AUTOSIZE);
cvtColor(src, src, COLOR_BGR2GRAY);//转灰度
createTrackbar("Threshold Value:", output_win, &threshold_value, threshold_max, Demo_Contours);//控制canny的阈值
Demo_Contours(0, 0);
waitKey(0);
return 0;
}
void Demo_Contours(int, void*) {
Mat canny_output;
vector<vector<Point>> contours;//建立一个多个轮廓多个轮廓点的数组
vector<Vec4i> hierachy;
Canny(src, canny_output, threshold_value, threshold_value * 2, 3, false);//Canny边缘检测
findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//寻找轮廓
dst = Mat::zeros(src.size(), CV_8UC3);//创建一张图片
RNG rng(12345);
for (size_t i = 0; i < contours.size(); i++) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//随机生成颜色
drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point());//画出轮廓
}
imshow(output_win, dst);
}
输出结果显示: