本文记录 OpenCV 中的轮廓查找的相关操作。 轮廓查找概述 一个轮廓对应一系列点,这些点以某种方式表示图像中的一条曲线。在不同情况下,这种表示方式也有所不同。有多种方式可以表示一条曲线。...OpenCV 中用一系列二维顶点表示一个轮廓 函数 cv2.findContours() 从二维图像中计算轮廓。...轮廓层次 在了解到底如何提取轮廓之前,有必要花一些时间来理解轮廓到底是什么以及一组轮廓之间如何互相关联。...OpenCV中的连通区域分析算法,输入要求是一张二值(黑白)图像,输出是一张像素标记图,其中属于同一连通区域的非零像素都是同一定值。...labels = cv2.connectedComponentsWithAlgorithm(img, 8, cv2.CV_32S, cv2.CCL_WU) PIS(labels) 参考资料 《学习 OpenCV3
本文将结合实例代码,介绍 OpenCV 如何查找轮廓、获取边界框。...代码: contours.py[1] OpenCV 提供了 findContours[2] 函数查找轮廓,需要以二值化图像作为输入、并指定些选项调用即可。 ? 我们以下图作为示例: ?...cv.getStructuringElement(cv.MORPH_RECT, (3, 3), (1, 1)) thres = cv.morphologyEx(thres, cv.MORPH_OPEN, kernel) 查找轮廓...# 查找轮廓 # cv.RETR_EXTERNAL: 只查找外部轮廓 contours, hierarchy = cv.findContours( threshold, cv.RETR_EXTERNAL...minEnclosingCircle 获取边界圈,并绘制: for contour in contours_poly: center, radius = cv.minEnclosingCircle(
步骤简述 使用OpenCV绘制矩形轮廓框,一般包括如下步骤: 转换为灰度图; 进行阈值处理; 进行中值滤波; 在原始图像上绘制矩形框。...附图解析 原始图像: 第一步,转换为灰度图: 第二步,经过阈值处理: 第三步,中值滤波后: 最后一步,在原始图像上绘制矩形框: 生成的记录文件(矩形轮廓框四个端点的平面坐标.../origin.jpg') # 文档路径,用于记录轮廓框坐标 txt_file = open('....threshold(src=pic, thresh=200, maxval=255, type=1) # 中值滤波,去除椒盐噪声 pic = cv2.medianBlur(pic, 5) # 边缘检测,得到的轮廓列表..._1, contours, _2 = cv2.findContours(pic, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 根据轮廓列表,循环在原始图像上绘制矩形边界
Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体。所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓。...OpenCV中有一个很强大的函数,它可以从二值图像中找到轮廓:findContours函数。 有时我们还需要把找到的轮廓画出来,那就要用到函数drawContours了。...#include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp" #include using namespace cv...#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include #include...OpenCV提供了一些函数来计算图像的矩: 矩的重心、主轴、面积等特征计算:moments() 计算轮廓面积:contourArea() 计算轮廓长度:arcLength() 下面的程序,使用了两种方法计算轮廓面积
本文记录 OpenCV 中的轮廓分析的相关操作。 多边形逼近 当我们绘制一个多边形或进行形状分析时,通常需要使用多边形逼近一个轮廓,使顶点数变少。...有多种方法可以实现这个功能,OpenCV实现了其中的两种逼近方法。 Douglas-Peucker(DP) 逼近算法 该算法首先从轮廓(图B)中挑出两个最远的点,将两点相连(图C)。...而函数cv2.minAreaRect可以返回一个包围轮廓最小的矩形,这个矩形很可能是倾斜的。 查找包含输入 2D 点集的最小区域的旋转矩形。....isContourConvex(hull)) --> False True 源码 https://github.com/zywvvd/Python_Practise/tree/master/OpenCV.../Chapter 14 参考资料 《学习OpenCV》 第十四章
一个跟轮廓相关的最常用到的功能是如何匹配多条轮廓。我们或许需要比较两条计算好的轮廓,或者比较一条轮廓和一个抽象模板。这两种情况都会在本文讨论。...[4.29714551e-06], [3.12207937e-04], [5.03721607e-08]]) 使用Hu矩进行匹配 我们想要使用Hu矩比较两个物体,并判定它们是否相似...为了使比较过程变得简单,OpenCV的函数cv2.matchShapes 允许我们简单提供两个物体,然后计算它们的矩,并根据我们提供的标准进行比较。...在 OpenCV 4.5.5 中还没有实现,有传说在 3.5 的版本中有相关函数 源码 https://github.com/zywvvd/Python_Practise/tree/master/OpenCV.../Chapter 14 参考资料 《学习OpenCV》 第十四章
// #include "stdafx.h" #include #include opencv2/highgui/highgui.hpp> #include opencv2.../core/core.hpp> #include opencv2/imgproc/imgproc.hpp> #pragma comment(lib, "opencv_highgui2410d.lib...") #pragma comment(lib, "opencv_core2410d.lib") #pragma comment(lib, "opencv_imgproc2410d.lib") using...= contours.end()) { //计算所有的距 Moments mom = moments(Mat(*itc++)); //计算并画出质心 ...其实,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) # 计算凸轮廓多变形时需要先处理轮廓 ?
for controlling float print precision #include // string to number conversion #include opencv2.../imgproc/imgproc.hpp> // Gaussian Blur #include opencv2/core/core.hpp> // Basic OpenCV structures...(cv::Mat, Scalar) #include opencv2/highgui/highgui.hpp> // OpenCV window I/O using namespace std
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里提取目标轮廓的函数是...storage, &contour,sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); tour_buf 是需要查找轮廓的单通道灰度图像..., storage 是临时存储区 , contour是存储轮廓点的CvSeq实例, CV_RECT_EXTERNAL 只查找外围轮廓,还有CV_RECT_TREE..._L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法 正确调用查找函数后,接下来就是从轮廓序列contour(这里的contour...cvFindContours(img, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, cvPoint(0,0)); //查找轮廓
范围 范围是轮廓区域与边界矩形区域的比值。...等效直径 等效直径是面积与轮廓面积相同的圆的直径。...pixelpoints = np.transpose(np.nonzero(mask)) #pixelpoints = cv.findNonZero(mask) 这里提供了两个方法,一个使用Numpy函数,另一个使用OpenCV...Numpy给出的坐标是(行、列)格式,而OpenCV给出的坐标是(x,y)格式。所以基本上答案是可以互换的。注意,row = x, column = y。 7.
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, 检测所有轮廓,所有轮廓建立一个等级树结构。...外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。
这个好像是骨头什么的,但是要求轮廓闭合,于是对图片进行一下膨胀操作,再次检测轮廓就好了。 // A closed contour.cpp : 定义控制台应用程序的入口点。...// #include "stdafx.h" #include #include #include opencv2/opencv.hpp> #include...opencv2/core/core.hpp> #include opencv2/imgproc/imgproc.hpp> #include opencv2/highgui/highgui.hpp...> //#include "highlight" //#include "highgui.h" #pragma comment(lib,"opencv_core2410d.lib")...#pragma comment(lib,"opencv_highgui2410d.lib") #pragma comment(lib,"opencv_imgproc2410d.lib")
OpenCV 入门教程:轮廓特征和轮廓匹配 导语 轮廓特征和轮廓匹配是图像处理中用于描述和比较轮廓的技术。通过提取轮廓的形状、面积、周长等特征,并进行比较和匹配,我们可以实现目标识别、形状分析等应用。...在本文中,我们将以轮廓特征和轮廓匹配为中心,为你介绍使用 OpenCV 进行轮廓处理的基本步骤和实例。...,并通过边缘检测和轮廓寻找获取轮廓。...总结 通过本文的介绍,你已经了解了使用 OpenCV 进行轮廓特征提取和轮廓匹配的基本步骤。...通过提取轮廓特征并比较轮廓之间的相似度,我们可以实现对图像中目标区域的定量分析和比较。 祝你在使用 OpenCV 进行轮廓特征和轮廓匹配的过程中取得成功!
效果:拉动ZoomBar,进行轮廓草图绘制。 应用:可以绘制画板。...实现: #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp" #include #include <iostream...360, white, -1, 8, 0 ); } namedWindow( "image", 1 ); imshow( "image", img ); //抽取轮廓
轮廓发现(find contour) 轮廓即是以某种方式表示图像中的曲线的点的列表。这种表示可以根据实际的情形不同而不同。表示一条曲线的方式有很多种。...轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现的结果。...OpenCV中,轮廓是由STL风格的vector模板对象表示的,其中vector中的每个元素都编码了曲线上,下一点的位置信息。 先上干货 Demo视频显示效果 ?...; cv::RETR_CCOMP:表示提取所有轮廓并将组织成一个两层结构,其中顶层轮廓是外部轮廓,第二层轮廓是“洞”的轮廓; cv::RETR_TREE:表示提取所有轮廓并组织成轮廓嵌套的完整层级结构。...offset = Point() // (可选) 所有点的偏移 ) 代码演示 新建一个项目opencv-0023,配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include
轮廓之间的父子关系 使用函数 cv2.findContours 来查找轮廓, 我们需要传入一个参数:轮廓提取模式(Contour_Retrieval_Mode)。...1 什么是层次结构 通常我们使用函数 cv2.findContours 在图片中查找一个对象。 有时对象可能位于不同的位置。 还有些情况,一个形状在另外一个形状的内部。...2 OpenCV 中层次结构 不管层次结构是什么样的,每一个轮廓都包含自己的信息: 谁是父,谁 是子等。...我们已经用红色数字为这些轮廓编号, 并用绿色数字代表它们的组织结构。顺序与 OpenCV 检测轮廓的顺序一致 ? 现在我们考虑轮廓 0,它的组织结构为第 1 级。...它甚至会告诉你谁是爷爷,爸 爸,儿子,孙子等 还是以上图为例,使用这种模式,对 OpenCV 返回的结果重新排序并分 析它, 红色数字是边界的序号,绿色是组织结构 轮廓 0 的组织结构为 0,
轮廓是一个形状具有相同灰度值的边界。 它会存贮形状边界上所有的 (x,y) 坐标。 但是需要将所有的这些边界点都存储吗?...这就是 cv2.CHAIN_APPROX_SIMPLE 要做的 它会将轮廓上的冗余点都去掉,压缩轮廓,从而节省内存开支 使用 cv2.CHAIN_APPROX_SIMPLE 的结果,一般只有 4 个点
其实查找相似的东西用机器学习训练的方式处理应该是最好的,今天做的这个小练习主要是针对OpenCV的matchShapes函数的练习,正好把OpenCV的几个函数综合运用一下。 实现效果 ?...从图上我们可以看出来,通过鼠标点击找到我们要实现的轮廓,然后通过匹配轮廓把找到的轮廓在左边的图中都画出来,其中是我们点击的轮廓就红色填充,匹配的相似轮廓用的蓝色填充,就是实现的一个这样简单的效果。...综合练习知识点 # 实现的方式及用到的学习函数 1 通过点击鼠标来选中需要匹配的轮廓,所以用到了setMouseCallback函数 2 基本图像操作,灰度图,高斯模糊,形态学梯度操作 3 查找轮廓findContours...微卡智享 OpenCV的项目搭建及配置请直接看《VS2017配置OpenCV通用属性》 整个项目中,一个main.cpp的文件,一个matchShape的类,如下图: ?..., Size(3, 3)); morphologyEx(gray, gray, MORPH_GRADIENT, kernel); //imshow("gray", gray); //4.查找轮廓
领取专属 10元无门槛券
手把手带您无忧上云