Opencv边缘检测、轮廓发现、绘制轮廓

提取图像轮廓的2个步骤

1、 findContours函数找轮廓,

2、 drawContours函数画轮廓

轮廓的查找——cv::findContours()

函数cv::findContour是从二值图像中来计算轮廓的,它可以使用cv::Canny()函数处理的图像,因为这样的图像含有边缘像素;也可以使用cv::threshold()或者cv::adaptiveThreshold()处理后的图像,其边缘隐含在正负区域的交界处。

轮廓的层级结构

下图所示了cv::findCountour()的基本功能,图的上部是一幅测试图像,其背景为白色,并含有数个彩色的的区域(标签A到E)。图中也绘制出了由cv::findContours()所确定的轮廓。这些轮廓被标记为cX或hX,其中c代表“contour(轮廓)”,h代表“洞(hole)”,而X是一些数字。有些轮廓使用虚线表示的,他们表示白色区域(即非零区域)的外部边界。OpenCV和cv::findContour()对这些外部边界和图中的点线,即内部边界或者是洞的外部边界,进行区分的。

如图的下半部分,OpenCV可以将找到的轮廓组织成轮廓树,表示其轮廓结构的包围关系。对于测试图像中的轮廓,我们将根节点处的轮廓称为c0,而“洞”h00和h01是其子节点。反过来这些子节点又会包含新的子节点以此类推。

表示这种树的方式有很多种,OpenCV中使用数组(尤其是vectors)来表示这种树,其中数组中的每个条目都代表一个特定的轮廓,每个条目包含一个由4个整数组成的集合(通常表示为cv :: Vec4i类型的元素,就像四通道数组中的条目一样)。对于每个节点来说,四个元素所表示的含义分别如下:0号元素表示下一个轮廓(同一层级);1号元素表示前一个轮廓(同一层级);2号元素表示第一个子轮廓(下一层级);3号元素表示父轮廓(上一层级)

drawContours函数的作用

主要用于画出图像的轮廓

函数的调用形式

void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )
函数参数详解:

其中第一个参数image表示目标图像,

第二个参数contours表示输入的轮廓组,每一组轮廓由点vector构成,

第三个参数contourIdx指明画第几个轮廓,如果该参数为负值,则画全部轮廓,

第四个参数color为轮廓的颜色,

第五个参数thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部,

第六个参数lineType为线型,

第七个参数为轮廓结构信息,

第八个参数为maxLevel

代码演示

/*
* 轮廓发现
* 1:输入图像转为灰度图像
* 2使用Canny进行边缘提取,得到二值图像
* 3使用findContours寻找轮廓
* 4使用drawContours绘制轮廓
*
*/
#include <opencv.hpp>
#include<iostream>
#include <string>
#include<conio.h>
#include<time.h>
using namespace std;
using namespace cv;Mat src, dst;
const char* output_win = "findcontours demo";
int threshold_value = 100;
int threshold_max = 255;
RNG rng;
void Demo_Contours(int, void*);
int main()
{src = imread("E:\\Users\\opencvCoder\\image\\niu.jpg");if (src.empty()){printf("could not load image...\n");return -1;}imshow("input_image", src);namedWindow("input_image", 0);namedWindow(output_win, 1);cvtColor(src, src, COLOR_BGR2GRAY);imshow("gray_image", src);const char* trackbar_title = "Threshold Value";createTrackbar(trackbar_title, output_win, &threshold_value, threshold_max, Demo_Contours);Demo_Contours(0, 0);waitKey(0);return 0;}
void Demo_Contours(int, void*)
{Mat canny_output;vector<vector<Point>>contours;vector<Vec4i>hierachy;/**Canny边缘检测的步骤:*1、去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。*2、计算梯度大小和方向。*3、非极大值抑制。就是适当的让边缘'变瘦'。*4、确定边缘。使用双阈值法确定最终的边缘信息。*/Canny(src, canny_output, threshold_value, threshold_value * 2, 3, false);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(0, 0));}imshow(output_win, dst);//canny_output 为图像掩码,将非零值复制给dstsrc.copyTo(dst, canny_output);//图像取反输出//imshow(output_win, ~dst);//正常输出imshow("mask image", dst);
}

Opencv边缘检测、轮廓发现、绘制轮廓相关推荐

  1. OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

  2. openCV专栏(八):图像轮廓:绘制轮廓

    OPENCV基础操作 提示:本专栏所用版本仅供参考,其他版本也可 库 版本 python Python 3.9.3 opencv 4.5.5 matplotlib 3.4.3 numpy 1.19.5 ...

  3. 【OpenCV 4开发详解】轮廓发现与绘制

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  4. python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv

    1.轮廓发现 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 1.1发现轮廓 在此步骤中我们会使用到findContours这个API,其原型为: ...

  5. opencv进阶学习笔记12:轮廓发现和对象测量

    基础版笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 轮廓发现 1轮廓发现介绍 基础 ...

  6. Opencv(六)模板匹配、轮廓检测、轮廓周围绘制矩形框和圆形框

    模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...

  7. opencv 裁剪 java_OpenCV绘制轮廓和裁剪

    我是OpenCV的新手 . 首先,将物体放在白纸上,然后使用机器人相机拍摄照片 . 在下一步,我试图使用OpenCV(找到轮廓和绘制轮廓)提取放在白纸上的对象 . 我想将这个对象用于我的机器人项目 . ...

  8. OpenCV学习笔记(十七):查找并绘制轮廓:findContours(),drawContours(),approxPolyDP()

    OpenCV学习笔记(十七):查找并绘制轮廓:findContours() 1.findContours() 函数 该函数使用Suzuki85算法从二值图像中检索轮廓.轮廓线是一种用于形状分析.目标检 ...

  9. Python机器视觉--OpenCV进阶(核心)--图像轮廓查找识别,绘制图像轮廓与图像轮廓的面积周长计算

    1.图像轮廓查找识别与绘制图像轮廓 1.1 什么是图像轮廓 图像轮廓是具有相同颜色或灰度的连续点的曲线. 轮廓在形状分析和物体的检测和识别中很有用. 轮廓的作用: 用于图形分析 物体的识别和检测 注意 ...

  10. opencv函数findcontours_OpenCV系列之轮廓入门 | 二十一

    目标 了解轮廓是什么. 学习查找轮廓,绘制轮廓等. 你将看到以下功能:cv.findContours(),cv.drawContours() 什么是轮廓? 轮廓可以简单地解释为连接具有相同颜色或强度的 ...

最新文章

  1. Miscellaneous Character Drivers
  2. AttributeError: module ‘matplotlib’ has no attribute ‘artist’
  3. techempower拿分系列之aspcore分析
  4. 小程序如何传数组数据到vs后台中
  5. 策略模式+工厂模式(反射)+枚举代替 大量 if..else if..
  6. 【算法笔记】B1058 选择题
  7. 力扣—— 51. N 皇后
  8. 学习Kubernetes 和容器技术体系的最佳方法
  9. bootstrap栅格系统中同行div高度不一致的解决方法
  10. Tomcat 简单容器化
  11. Java泛型_自定义泛型类
  12. c语言编程多项式,多项式c语言编程.docx
  13. LaTeX笔记(二)(开篇)
  14. 计算机里pow函数是什么,pow函数是什么?
  15. 谈谈Oracle甲骨文可视化文件查看器:AutoVue
  16. 给电脑文件批量重命名和更改后缀名
  17. 硬实时RTLinux?为Linux打实时preempt_rt补丁
  18. 计算机无法检索文件夹,win7系统不能搜索文件夹怎么回事
  19. 如何打出带圈的11?
  20. 四阶龙格库塔法的基本思想_请问用四阶龙格库塔法解二阶微分方程的思想是什么?...

热门文章

  1. SSL证书的域名验证操作指引
  2. GDCPC2019 广东省赛总结
  3. 视频中人体行为识别与理解综述_杨兴江_笔记
  4. 上海百络隆重推出免费上网监控软件-《百络网警》家庭版V6.6B9
  5. python多线程实现异步_python多线程实现异步
  6. 装完nvme固态经常蓝屏_Win10 KB4586853修复NVMe SSD导致蓝屏死机问题
  7. 《水文地质学基础》在线平时作业2
  8. 上海交通大学船舶海洋与建筑工程学院谢彬Numerical TESTs for PDEs解答5.2.2
  9. ​ 干货分享|letswave 操作手册
  10. php 读取图片的属性,PHP 提取图片img标记中的任意属性的简单实例