本文记录 OpenCV 中的轮廓查找的相关操作。 轮廓查找概述 一个轮廓对应一系列点,这些点以某种方式表示图像中的一条曲线。在不同情况下,这种表示方式也有所不同。有多种方式可以表示一条曲线。...OpenCV 中用一系列二维顶点表示一个轮廓 函数 cv2.findContours() 从二维图像中计算轮廓。...轮廓层次 在了解到底如何提取轮廓之前,有必要花一些时间来理解轮廓到底是什么以及一组轮廓之间如何互相关联。...OpenCV中的连通区域分析算法,输入要求是一张二值(黑白)图像,输出是一张像素标记图,其中属于同一连通区域的非零像素都是同一定值。...labels = cv2.connectedComponentsWithAlgorithm(img, 8, cv2.CV_32S, cv2.CCL_WU) PIS(labels) 参考资料 《学习 OpenCV3
当分析一张图像的时候,针对轮廓,我们也许有很多事情要做。毕竟,所有轮廓都是或即将是我们想要进行识别或操作的。另外相关的还有多种对轮廓的处理,如描述轮廓,简化或拟合轮廓,匹配轮廓到模板,等等。...本文记录 OpenCV 中的轮廓分析的相关操作。 多边形逼近 当我们绘制一个多边形或进行形状分析时,通常需要使用多边形逼近一个轮廓,使顶点数变少。...有多种方法可以实现这个功能,OpenCV实现了其中的两种逼近方法。 Douglas-Peucker(DP) 逼近算法 该算法首先从轮廓(图B)中挑出两个最远的点,将两点相连(图C)。....isContourConvex(hull)) --> False True 源码 https://github.com/zywvvd/Python_Practise/tree/master/OpenCV.../Chapter 14 参考资料 《学习OpenCV》 第十四章
一个跟轮廓相关的最常用到的功能是如何匹配多条轮廓。我们或许需要比较两条计算好的轮廓,或者比较一条轮廓和一个抽象模板。这两种情况都会在本文讨论。...矩 相关介绍 比较两条轮廓最简洁的方法之一是比较它们的轮廓矩。轮廓矩代表了一条轮廓、一幅图像、一组点集的某些高级特征。下面的所有讨论对轮廓、图像、点集都同样适用,简便起见,将它们统称为对象。...OpenCV 努力提供比矩匹配更好的形状匹配算法 https://docs.opencv.org/4.5.5/d1/d85/group__shape.html#ga1d058c5d00f6292da61422af2f3f4adc...在 OpenCV 4.5.5 中还没有实现,有传说在 3.5 的版本中有相关函数 源码 https://github.com/zywvvd/Python_Practise/tree/master/OpenCV.../Chapter 14 参考资料 《学习OpenCV》 第十四章
// #include "stdafx.h" #include #include #include #include #pragma comment(lib, "opencv_highgui2410d.lib...") #pragma comment(lib, "opencv_core2410d.lib") #pragma comment(lib, "opencv_imgproc2410d.lib") using...OpenCV提供了很多函数,我们展示其中的几个: [cpp] view plain copy //轮廓的形状描述子 //外接矩形 Rect r0 = boundingRect(Mat(...其实,OpenCV还提供了许多其他的形状描述子,比如函数cv::minAreaRect计算了最小外界倾斜的矩形。函数 cv::contourArea估计轮廓区域的面积(里面的像素数)。
在计算机视觉中,轮廓检测是另一个比较重要的任务。它包含的操作有计算矩形边界、圆形边界、多边形边界等等。 我们以下面的黑猫图为例来讲解如何利用OpenCV进行轮廓检测。 ?...此时,我们可以检测轮廓点集(图中绿色的外边界点) #2个返回值,分别是轮廓的点集(contours)和各层轮廓的索引(hierarchy) # openCV 4 , 否则注意版本差异!...之后,我们可以循环求得图形各部分的矩形轮廓线: for c in contours: #对于每一个轮廓 #无倾斜的 边界矩形框 x, y, w, h = cv2.boundingRect...图中有些过小的轮廓也显示出来了,我们可以加点尺寸限制,将它们过滤掉: W,H = img0.shape[0], img0.shape[1] for c in contours: #对于每一个轮廓...通常我们会计算凸多边线轮廓: #凸轮廓需要先加上下面这句 hull = cv2.convexHull(c) # 计算凸轮廓多变形时需要先处理轮廓 ?
本文将结合实例代码,介绍 OpenCV 如何查找轮廓、获取边界框。...代码: contours.py[1] OpenCV 提供了 findContours[2] 函数查找轮廓,需要以二值化图像作为输入、并指定些选项调用即可。 ? 我们以下图作为示例: ?...但其他模型会有只出预测掩膜的,此时想要边框就可以使用 OpenCV 来提取。...# 查找轮廓 # cv.RETR_EXTERNAL: 只查找外部轮廓 contours, hierarchy = cv.findContours( threshold, cv.RETR_EXTERNAL...参考 OpenCV Tutorials / Image Processing[4] 脚注 [1] contours.py: https://github.com/ikuokuo/start-opencv
opencv提供了findContours函数查找轮廓,函数原型为 CV_EXPORTS_W void findContours( InputOutputArray image, OutputArrayOfArrays...: CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略 CV_RETR_LIST 检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系...,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1 CV_RETR_CCOMP 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层...,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层 CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。...外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。
范围 范围是轮廓区域与边界矩形区域的比值。...等效直径 等效直径是面积与轮廓面积相同的圆的直径。...pixelpoints = np.transpose(np.nonzero(mask)) #pixelpoints = cv.findNonZero(mask) 这里提供了两个方法,一个使用Numpy函数,另一个使用OpenCV...Numpy给出的坐标是(行、列)格式,而OpenCV给出的坐标是(x,y)格式。所以基本上答案是可以互换的。注意,row = x, column = y。 7.
1 长宽比 边界矩形的宽高比 x,y,w,h = cv2.boundingRect(cnt) aspect_ratio = float(w)/h 2 Extent 轮廓面积与边界矩形面积的比 area...contourArea(cnt) x,y,w,h = cv2.boundingRect(cnt) rect_area = w*h extent = float(area)/rect_area 3 Solidity 轮廓面积与凸包面积的比...convexHull(cnt) hull_area = cv2.contourArea(hull) solidity = float(area)/hull_area 4 Equivalent Diameter 与轮廓面积相等的圆形的直径...旋转角度 6 掩模和像素点 有时我们需要构成对象的所有像素点,我们可以这样做 mask = np.zeros(imgray.shape,np.uint8) # 这里一定要使用参数-1, 绘制填充的的轮廓....drawContours(mask,[cnt],0,255,-1) //方法一 bumpy方法 pixelpoints = np.transpose(np.nonzero(mask)) //方法二 opencv
转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 基础介绍 OpenCV里提取目标轮廓的函数是...This full hierarchy is built and shown in the OpenCV contours.c demo. method – Contour approximation...This full hierarchy is built and shown in the OpenCV contours.c demo. method – Contour approximation...不单单只有一个轮廓序列) 提取轮廓点了. ...") #pragma comment(lib,"opencv_highgui2410d.lib") #pragma comment(lib,"opencv_imgproc2410d.lib
这个好像是骨头什么的,但是要求轮廓闭合,于是对图片进行一下膨胀操作,再次检测轮廓就好了。 // A closed contour.cpp : 定义控制台应用程序的入口点。...// #include "stdafx.h" #include #include #include #include... #include #include //#include "highlight" //#include "highgui.h" #pragma comment(lib,"opencv_core2410d.lib")...#pragma comment(lib,"opencv_highgui2410d.lib") #pragma comment(lib,"opencv_imgproc2410d.lib")
效果:拉动ZoomBar,进行轮廓草图绘制。 应用:可以绘制画板。...实现: #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp" #include #include <iostream...360, white, -1, 8, 0 ); } namedWindow( "image", 1 ); imshow( "image", img ); //抽取轮廓
OpenCV 入门教程:轮廓特征和轮廓匹配 导语 轮廓特征和轮廓匹配是图像处理中用于描述和比较轮廓的技术。通过提取轮廓的形状、面积、周长等特征,并进行比较和匹配,我们可以实现目标识别、形状分析等应用。...在本文中,我们将以轮廓特征和轮廓匹配为中心,为你介绍使用 OpenCV 进行轮廓处理的基本步骤和实例。...❤️ ❤️ ❤️ ❤️ ❤️ 一、轮廓特征 轮廓特征是指从轮廓中提取的描述性信息,用于对轮廓进行定量分析。以下是一些常见的轮廓特征: 1 面积( Area ):表示轮廓包围的区域的面积大小。...总结 通过本文的介绍,你已经了解了使用 OpenCV 进行轮廓特征提取和轮廓匹配的基本步骤。...通过提取轮廓特征并比较轮廓之间的相似度,我们可以实现对图像中目标区域的定量分析和比较。 祝你在使用 OpenCV 进行轮廓特征和轮廓匹配的过程中取得成功!
轮廓发现(find contour) 轮廓即是以某种方式表示图像中的曲线的点的列表。这种表示可以根据实际的情形不同而不同。表示一条曲线的方式有很多种。...轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现的结果。...OpenCV中,轮廓是由STL风格的vector模板对象表示的,其中vector中的每个元素都编码了曲线上,下一点的位置信息。 先上干货 Demo视频显示效果 ?...; cv::RETR_CCOMP:表示提取所有轮廓并将组织成一个两层结构,其中顶层轮廓是外部轮廓,第二层轮廓是“洞”的轮廓; cv::RETR_TREE:表示提取所有轮廓并组织成轮廓嵌套的完整层级结构。...offset = Point() // (可选) 所有点的偏移 ) 代码演示 新建一个项目opencv-0023,配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include
轮廓是一个形状具有相同灰度值的边界。 它会存贮形状边界上所有的 (x,y) 坐标。 但是需要将所有的这些边界点都存储吗?...这就是 cv2.CHAIN_APPROX_SIMPLE 要做的 它会将轮廓上的冗余点都去掉,压缩轮廓,从而节省内存开支 使用 cv2.CHAIN_APPROX_SIMPLE 的结果,一般只有 4 个点
其实查找相似的东西用机器学习训练的方式处理应该是最好的,今天做的这个小练习主要是针对OpenCV的matchShapes函数的练习,正好把OpenCV的几个函数综合运用一下。 实现效果 ?...从图上我们可以看出来,通过鼠标点击找到我们要实现的轮廓,然后通过匹配轮廓把找到的轮廓在左边的图中都画出来,其中是我们点击的轮廓就红色填充,匹配的相似轮廓用的蓝色填充,就是实现的一个这样简单的效果。...,获取鼠标点击的轮廓pointPolygonTest 4 轮廓匹配matchShapes 代码实现 ?...微卡智享 OpenCV的项目搭建及配置请直接看《VS2017配置OpenCV通用属性》 整个项目中,一个main.cpp的文件,一个matchShape的类,如下图: ?...main.cpp #include #include #include"matchShape.h" using namespace cv;
最后轮廓 4,5 是轮廓 3a 的子轮廓,成为(组织结构)4 级(最后一级)。 按照这种方式 给这些形状编号, 我们可以说轮廓 4 是轮廓 3a 的子轮廓(当然轮廓 5 也是)。...2 OpenCV 中层次结构 不管层次结构是什么样的,每一个轮廓都包含自己的信息: 谁是父,谁 是子等。...OpenCV 使用一个含有四个元素的数组表示: [Next,Previous, First_Child,Parent] Next 表示同一级组织结构中的下一个轮廓。...我们已经用红色数字为这些轮廓编号, 并用绿色数字代表它们的组织结构。顺序与 OpenCV 检测轮廓的顺序一致 ? 现在我们考虑轮廓 0,它的组织结构为第 1 级。...它甚至会告诉你谁是爷爷,爸 爸,儿子,孙子等 还是以上图为例,使用这种模式,对 OpenCV 返回的结果重新排序并分 析它, 红色数字是边界的序号,绿色是组织结构 轮廓 0 的组织结构为 0,
cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) 2 轮廓面积 轮廓的面积可以使用函数 cv2.contourArea() 计算得到,...这个函数 的第二参数可以用来指定对象的形状是闭合的(True),还是打开的(一条曲线) perimeter = cv2.arcLength(cnt,True) 4 轮廓近似 将轮廓形状近似到另外一种由更少点组成的轮廓形状...,新轮廓的点的数目 由我们设定的准确度来决定。...这个函数的第二个参数叫 epsilon,它是从原始轮廓到近似轮廓的最大距离。 它是一个准确度参数。..., 第三幅 图是当 epsilon = 1% 时得到的近似轮廓。
函数 cv2.minEnclosingCircle() 可以帮我们找到一个对象的外切圆。 它是所有能够包括对象的圆中面积最小的一个
1 凸包 凸包与轮廓近似相似,但不同,虽然有些情况下它们给出的结果是一样的。 函数 cv2.convexHull() 可以用来检测一个曲线是否具有凸性缺陷,并能纠 正缺陷。...hull = cv2.convexHull(points[, hull[, clockwise[, returnPoints]] 参数: • points 我们要传入的轮廓 • hull 输出,...如果设置 为 False,就会返回与凸包点对应的轮廓上的点 一般使用,下面的语句就够了 hull = cv2.convexHull(cnt) 但是如果你想获得凸性缺陷,需要把 returnPoints...以上面的矩形为例,首先我们找到他的轮廓 cnt。...现在把 returnPoints 设置为 False,我得到的结果是 [[129],[ 67],[ 0],[142]] 他们是轮廓点的索引。
领取专属 10元无门槛券
手把手带您无忧上云