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


    目录

    概述

    函数

    findContours()

    drawContours()

    测试代码

    测试结果

    参考


    概述

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

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

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

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

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

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

    函数

    findContours()

    1. void cv::findContours
    2. (
    3. InputArray image,
    4. OutputArrayOfArrays contours,
    5. OutputArray hierarchy,
    6. int mode,
    7. int method,
    8. Point offset = Point()
    9. )
    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()

    1. void cv::drawContours
    2. (
    3. InputOutputArray image,
    4. InputArrayOfArrays contours,
    5. int contourIdx,
    6. const Scalar & color,
    7. int thickness = 1,
    8. int lineType = LINE_8,
    9. InputArray hierarchy = noArray(),
    10. int maxLevel = INT_MAX,
    11. Point offset = Point()
    12. )
    image目标图像(绘制图形的画板,一般使用进行检测的初始图像。)
    contours所有需要进行绘制的轮廓(即 findContours() 中的 contours)
    contourIDx绘制轮廓的参数(如果为负值,则绘制所有轮廓)
    color轮廓的颜色
    thickness轮廓的等距厚度(若 thickness=FILLED,则对轮廓线进行填充)
    lineType轮廓线的线型
    hierarchy层次结构的可选信息(当只想绘制部分轮廓时,需要此选项)
    maxlevel

    轮廓的绘制级别(层次结构信息存在时,执行此参数)

     ● 如果为0,则仅绘制指定的轮廓。

     ● 如果为1,该函数将绘制轮廓和所有嵌套轮廓。

     ● 如果为2,则函数将绘制轮廓、所有嵌套轮廓、所有从嵌套到嵌套的轮廓等等。

    offset轮廓偏移量

    测试代码

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include <QDebug>
    4. #include <opencv2/core/core.hpp>
    5. #include <opencv2/highgui/highgui.hpp>
    6. #include <opencv2/imgproc/imgproc.hpp>
    7. #include <vector>
    8. using namespace cv;
    9. using namespace std;
    10. Widget::Widget(QWidget *parent)
    11. : QWidget(parent)
    12. , ui(new Ui::Widget)
    13. {
    14. ui->setupUi(this);
    15. //定义输入和输出图像
    16. Mat src;
    17. Mat dst_gray,
    18. dst_blur,
    19. dst_canny,
    20. dst_dilate,
    21. dst;
    22. //载入图像
    23. src = imread("c:/opencv/x6.bmp");
    24. //显示
    25. imshow("src",src);
    26. //灰度处理
    27. cv::cvtColor(src,dst_gray,COLOR_BGR2GRAY);
    28. //显示
    29. imshow("dst_gray",dst_gray);
    30. //高斯模糊
    31. GaussianBlur(dst_gray,dst_blur,Size(3,3),0,0);
    32. //显示
    33. imshow("dst_blur",dst_blur);
    34. //边缘检测
    35. Canny(dst_blur,dst_canny,200,220);
    36. //显示
    37. imshow("dst_canny",dst_canny);
    38. //膨胀
    39. dilate(dst_canny,dst_dilate,Mat());
    40. //显示
    41. imshow("dst_dilate",dst_dilate);
    42. //克隆
    43. Mat src_find = src.clone();
    44. //检测轮廓
    45. vector<vector<Point>> contours;
    46. findContours(dst_dilate,contours,RETR_LIST,CHAIN_APPROX_SIMPLE);
    47. //绘制轮廓
    48. drawContours(src_find,contours,-1,Scalar(255,0,255),FILLED);
    49. //显示
    50. imshow("src_find",src_find);
    51. }
    52. Widget::~Widget()
    53. {
    54. delete ui;
    55. }

    测试结果

    参考

    7、OPencv 图形轮廓检测

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

    OpenCV API For JAVA —— findContours 查找轮廓

    OpenCV源码解析之findContours

    Java OpenCV findContours函数RETR_LIST轮廓顺序

  • 相关阅读:
    IT专业入门,高考假期预习指南
    前端js手写面试题汇总(一)
    Java 代码 实现 字符串去掉左边空格 字符串去掉右边空格
    【数据结构】二叉树的遍历
    【Linux】弄懂用户态与内核态
    3层结构+7大特点,带你认识华为云IoTEdge
    如何安装和使用three.js
    ES6中对Promise的理解以及它的实例方法
    linux进程控制类命令
    nacos启动指令
  • 原文地址:https://blog.csdn.net/ssismm/article/details/127859622