目录
概述
函数
findContours()
drawContours()
测试代码
测试结果
参考
想要实现轮廓检测,首先需要对图像进行预处理。依次为:
图像灰度化、高斯模糊、Canny边缘检测、膨胀 。
上述函数的使用可以查阅:
Qt-OpenCV学习笔记--基础知识和基本操作--总结
然后,用函数 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个顶点的坐标信息) CV_CHAIN_APPROX_TC89_L1 使用Teh-Chin 链近似算法 CV_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
#include
#include
#include
#include
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> 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;
}
7、OPencv 图形轮廓检测
opencv学习(四十)之寻找图像轮廓findContours()
OpenCV API For JAVA —— findContours 查找轮廓
OpenCV源码解析之findContours
Java OpenCV findContours函数RETR_LIST轮廓顺序