Qt-OpenCV学习笔记--图形轮廓检测

目录

概述

函数

findContours()

drawContours()

测试代码

测试结果

参考


概述

想要实现轮廓检测,首先需要对图像进行预处理。依次为:

图像灰度化高斯模糊Canny边缘检测膨胀 

上述函数的使用可以查阅:

Qt-OpenCV学习笔记--基础知识和基本操作--总结

然后,用函数 findContours() 检测轮廓。

最后,用函数 drawContours() 绘制轮廓。

函数

findContours()

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轮廓偏移量

drawContours()

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;
}

测试结果

参考

7、OPencv 图形轮廓检测

opencv学习(四十)之寻找图像轮廓findContours()

OpenCV API For JAVA —— findContours 查找轮廓

OpenCV源码解析之findContours

Java OpenCV findContours函数RETR_LIST轮廓顺序

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值