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

article/2025/9/15 11:53:44

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

http://chatgpt.dhexx.cn/article/kahFlLtV.shtml

相关文章

基于Python的Opencv边缘检测

边缘检测实际上就是对图像进行系统的梯度计算&#xff0c;包含了图像的噪声处理&#xff0c;非极大值抑制&#xff0c;双阈值检测等一系列图像处理方式&#xff0c;通过这些方式处理图像后得到图像的轮廓。这些方式在之前的博客都已经提到过i了&#xff0c;而Opencv提供了一个非…

OpenCV 边缘检测

一. 实验内容 用OpenCV对图片进行边缘检测。 二. 实验代码 //边缘检测 class Task17 { public:void deal() {Mat src_img imread("img\\1.jpg");imshow("边缘检测[原图]", src_img);Mat gray_img;cvtColor(src_img, gray_img, COLOR_BGR2GRAY);Mat out…

java-opencv边缘检测

安装opencv 导入jar包需要dll jar包在opencv\build\java目录里&#xff0c;dll文件在opencv\build\java\64x目录里 边缘检测 package opencv;import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc…

python opencv边缘检测

通过Opencv进行边缘检测可以说是十分常见了&#xff0c;接下来让我们聊一聊如何通过python opencv一步一步实现边缘检测 重要函数讲解 图片读取函数: pic cv2.imread(file_path, flagNone) 参数&#xff1a; file_path:读取的图片的路径。这里要注意如果图像不能读取(由于…

python-opencv边缘检测

9.python-opencv边缘检测 第一章 python-opencv-图片导入和显示 第二章 python-opencv图像简单处理 第三章 python-opencv图像mask掩膜处理 第四章 python-opencv图像马赛克 第五章 python-opencv人脸马赛克 第六章 python-opencv人脸检测 第七章 python-opencv图像张贴 第八章…

opencv边缘检测

边缘检测的一般步骤 滤波 边缘检测的算法对噪声很敏感&#xff0c;所以采用滤波器来改善边缘检测器的性能。 增强 增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时&#xff0c;可通过计算梯度…

14---OpenCV:图像检测之边缘检测

一、图像边缘 边缘(edge)是指图像局部强度变化最显著的部分。主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间&#xff0c;是图像分割、纹理特征和形状特征等图像分析的重要基础。图像强度的显著变化可分为&#xff1a; 阶跃变化函数&#xff0c;即图像强度在…

OpenCV学习11_边缘检测

本部分,我们将一起学习OpenCV中边缘检测的各种算子和滤波器-Canny算子、Sobel算子、Laplacian算子以及Scharr滤波器。 一、边缘检测步骤 在具体介绍之前,先来一起看看边缘检测的一般步骤。 1.【第一步】滤波 边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪…

opencv--边缘检测

opencv--边缘检测 1 边缘检测原理2 Sobel检测算子2.1 Sobel检测方法2.2 应用 3 Laplacian算子4. Canny边缘检测4.1 原理4.2应用 5 算子比较 1 边缘检测原理 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性…

【OpenCV--边缘检测】

目录 一、边缘检测概念 二、Sobel算子 1.描述&#xff1a; 2.方法&#xff1a; 3.Sobel算子的应用&#xff1a; 三、Laplacian算子 1.描述&#xff1a; 2.应用&#xff1a; 四、Canny边缘检测 1.原理&#xff1a; 2.应用&#xff1a; 一、边缘检测概念 1.边缘检测是图像处理和…

利用OpenCV进行边缘检测

简 介&#xff1a; 本文讨论了图像处理中重要的技术&#xff1a;边缘检测&#xff0c;重点介绍了两种方法&#xff08;Sobel边缘检测和Canny边缘检测&#xff09;。在展示OpenCV中的用法 同时也强调了为什么图像平滑是重要的预处理步骤。在Canny边缘检测中 也是使用的Sobel算子…

微信小程序实现轮播图根据图片大小自适应高度

上效果图 话不多说——————上代码 首先wxml <swiper class"con_img" style"height:{{swiperheight}}px" indicator-dots"true" autoplay"true" indicator-active-color"#f8e112" bindchange"changeheight&quo…

微信小程序-图片自适应

image组件 使用使用mode&#xff1a;widthFix&#xff0c;宽度固定&#xff0c;高度自适应 <image class"nav_img" mode"widthFix" src"{{img}}"></image> 注意&#xff0c;在初次进入页面时会有高度拉伸情况&#xff0c;使用样式…

小程序中图片宽度实现100%,高度自适应

在做轮播图时放了几个图片&#xff0c;但是显示一直怪怪的&#xff0c;宽度没有占满&#xff0c;右边总是留一大块空白&#xff0c;怪难看的&#xff0c;开始试了所有的mode属性都不行&#xff0c;至于mode属性起什么作用可以查一下小程序组件的API说明&#xff0c;主要用于控制…

微信小程序之swiper组件高度自适应

要求&#xff1a; &#xff08;顶部广告栏 &#xff09; 改变swiper组件的固定高度&#xff0c;使之随内部每张图片的高度做自适应 原理&#xff1a; 图片加载完之后&#xff0c;获取图片的原始宽高&#xff0c;根据宽高比&#xff0c;计算出适应后的宽高&#xff0c;如果是适…

微信小程序图片固定宽度,高度自适应处理方法及相关API介绍

微信小程序图片固定宽度&#xff0c;高度自适应处理方法及相关API介绍 1、背景 在我们写js代码时&#xff0c;控制图片固定宽度固定&#xff0c;使得高度自适应缩小&#xff0c;是非常简单的&#xff0c;但在微信小程序中不了解微信小程中组件image相关的属性是有些麻烦的&am…

html微信图片自适应,微信小程序实现图片高度自适应

1. swiper轮播海报通过wx.getSystemInfo接口获取屏幕高度&#xff0c;高度依据图片宽高等比缩放 运行于app.js&#xff0c;全局保存 // 设备信息 wx.getSystemInfo({ success: function(res) { that.screenWidth res.windowWidth; } }); page前端调用 bannerHeight: Math.ceil…

微信小程序的swiper轮播图中的图片设置自适应高度的一种方法

微信小程序的swiper轮播图中的图片设置自适应高度的一种方法 小程序中的轮播图很简单&#xff0c;但是唯一的缺陷就是 swiper 是固定的150px 高度&#xff08;320px 宽度&#xff09;&#xff0c;这样如果传入的图片大于这个高度就会被隐藏。那么如何让图片自适应不同分辨率是一…

【小程序中image自适应以及默认高度问题】

原因&#xff1a;小程序不知道background-image&#xff0c;本人开发小程序有个头图&#xff0c;根据天气展示不同的头图&#xff0c;要适配各种宽窄不同的屏幕以及Ipad&#xff0c;不能拉伸图片&#xff0c;UI不同意使用渐变&#xff0c;其实使用宽100%完全可以解决&#xff0…

小程序图片高度自适应等问题

小程序图片高度自适应 这里踩了很多遍的坑&#xff0c;花了很多时间&#xff0c;以为像以前以前给他上级的盒子不给高度就行了&#xff0c;oh,no&#xff0c;这是一个坑&#xff0c;关键在于image标签的一个属性&#xff1a;mode"widthFix"&#xff0c;简单搞定 &l…